laravel有很多通过Piviot表

时间:2019-03-27 14:56:20

标签: laravel laravel-5 eloquent

我有3张桌子

    Products
    id, name, image
    Offers
    id,name
    Offer_product
    id,offer_id,product_id

我正在使用进行分页访问产品表的数据

$list  = Product::query()->paginate(6);

现在,我想要具有要约名称的产品的完整记录存储在要约表中。产品和要约的id都存储在offer_product表中,其中一个产品可以有很多要约

1 个答案:

答案 0 :(得分:1)

在数据库设计中,您有一个多对多关系,在Laravel中,该关系由belongsToMany https://laravel.com/docs/5.7/eloquent-relationships#many-to-many处理。

hasManyThrough适用于级联“一对多->一对多”情况。假设一个艺术家有很多专辑,每个专辑有很多歌曲,那么一个艺术家有很多通过专辑的歌曲。如果您需要艺术家歌曲,则可以直接使用hasManyThrough

在您的情况下,您在Product.php模型中的关系应为:

public function offers() {
    return $this->belongsToMany(Offer::class, 'Offer_product')->withPivot('id');
}

Offer.php模型中:

public function products() {
    return $this->belongsToMany(Product::class, 'Offer_product')->withPivot('id');
}

现在,如果您希望所有这些人都渴望加载https://laravel.com/docs/5.7/eloquent-relationships#eager-loading来避免对数据库进行N(products)+1次调用:

$products = Product::with('offers')->get();
foreach ($products as $product) {
    echo 'product : '.$product->name.'<br/>';
    foreach($product->offers as $offer) {
        echo '<br>---- offer : '.$offer->name;
        // once you called the relation, then you can access data on pivot table
        echo ' - pivot id :'.$offer->pivot->id;
    }
}