一对多+一对多

时间:2018-11-05 19:31:50

标签: laravel laravel-5 eloquent

我有3个主表(sellersstoresproducts),还有另一个表用于存储与产品之间的关系(store_product

  • 卖方有许多商店(一对多关系)

  • 一个商店具有许多产品,但是这些产品中的任何一个都可以分配给多个商店 >,也许在另一个卖家的商店中(多对多关系)

现在,我很困惑,我想为特定卖家提供所有产品。

2 个答案:

答案 0 :(得分:2)

您需要的是构建器功能whereHas('relation', $callback)。使用它,您的查询非常简单:

$products = Product::query()
    ->whereHas('stores.seller', function ($query) use ($sellerId) {
        $query->where('sellers.id', $sellerId);
    })
    ->get();

显然,使用sellers.id(其中sellers是表名)很重要,因为您很可能在所有三个表上都有一个名为id的列。如果省略表名,查询将失败。

答案 1 :(得分:2)

如果定义了关系保留,则可以执行以下操作:

// your seller's id
$seller_id = 1;

// get your products
$products = Product::whereHas('stores.seller', function ($query) use ($seller_id) {
    $query->where('id', $seller_id);
})->get();

更新

要获取每个卖方的产品数量,可以使用withCount()方法,如下所示:

$sellers = Seller::withCount(['stores' => function ($query){
    $query->withCount('products');
})->get();

这将在结果模型的{relation}_count关系内放置一个stores列。在这种情况下,products_count

foreach ($sellers as $seller) {
    echo $seller->stores->first()->products_count;
}