OneToMany + ManyToMany - PullRequest
       8

OneToMany + ManyToMany

0 голосов
/ 05 ноября 2018

У меня есть 3 основных таблицы (sellers, stores, products), и есть еще одна таблица для связи между магазинами и продуктами (store_product)

  • A продавец имеет множество магазинов (отношение один ко многим)

  • A store имеет много продуктов , но любой из этих продуктов может быть назначен нескольким магазинам , возможно, в магазины другого продавца (отношения Many To Many)

Теперь у меня путаница, я хочу получить все товары для конкретного продавца.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Если вы определили резерв отношений, вы можете сделать:

// 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;
}
0 голосов
/ 05 ноября 2018

Что вам нужно, так это функция компоновщика whereHas('relation', $callback). С ним ваш запрос очень прост:

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

Очевидно, что использование sellers.id (где sellers - это имя таблицы) важно, поскольку у вас, скорее всего, есть столбец с именем id во всех трех таблицах. Если вы опустите имя таблицы, запрос не будет выполнен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...