@JeanPaulBelmondo

Как отфильтровать по связанной сущности belongsToMany?

Имеются две сущности:
- products, с полями id, name, price;
- collections, с полями id, name, external_collection_id;
отношение у них многие ко многим, соответственно есть таблица collection_product, c полями collection_id и product_id;

Мне нужно получить все товары, кроме тех, id коллекций которых есть в запросе.

Проблема вот в чём:
мой запрос

Product::whereHas('collections', function (Builder $query) {
    return $query->whereNotIn('id', [15]);
})->orderBy('created_at', 'desc')->limit(4)->get(),



В итоге в ответе всё равно есть продукты которые лежат в коллекции с id 15.

сработает только в том случае, если напишу что-то вроде
$query->whereNotIn('collection_id', [12, 14, 15])

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

как быть и что я делаю не так?
  • Вопрос задан
  • 95 просмотров
Решения вопроса 2
iMedved2009
@iMedved2009
Не люблю людей
Ну логически подумайте. Вы говорите дайте мне записи у которых существуют коллекции не с 15. Ясень хрен туда будут попадать записи у которых collection_id есть 15, но еще есть и collection_id = 14.

Надо делать обратное. Дай записи у которых точно нет записей с collection_id = 15.
Product::whereDoesntHave('collections', function (Builder $query) {
    return $query->whereIn('id', [15]);
})->orderBy('created_at', 'desc')->limit(4)->get();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы