Laravel, где условные отношения не работают должным образом - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть модель Product, которая подключена к модели Variant.Затем этот вариант подключается к Option.

Мой запрос:

$query = Product::orderBy($params['orderBy'], $params['sort']);

$query->whereHas('variants.options', function($query) use ($params) {
  $query->where('options.name', '10');
  $query->where('options.name', 'rose');
  $query->where('inventory_quantity', '>', 0);
});

По какой-то причине он не возвращает Products, в котором Variant имеет два отдельныхOptions подключен (10 и Rose) и где inventory_quantity варианта больше, чем 0.

Он работает правильно, когда я удаляю строку $query->where('options.name', 'rose');.

Варианты связаны с опциями через сводную таблицу variant_option.Значения правильно хранятся в этой таблице.

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Вы запрашиваете продукты, у которых есть опция (через варианты) с именем, которое равно 10 и поднялось одновременно.Конечно, это никогда не может быть правдой.

Вместо этого вам нужно добавить два блока whereHas() внутри блока whereHas('variants'), чтобы подтвердить обе опции:

$products = Product::query()
    ->whereHas('variants', function ($query) {
        $query->whereHas('options', function ($query) {
            $query->where('options.name', '10');
        })
        ->whereHas('options', function ($query) {
            $query->where('options.name', 'rose');
        })
        ->where('inventory_quantity', '>', 0);
    })
    ->orderBy($params['orderBy'], $params['sort'])
    ->get();

Это буквально читается как:
Дайте мне все продукты, у которых есть хотя бы один вариант, который есть в наличии и имеет как минимум два варианта, один из которых называется 10, а другой - rose.

0 голосов
/ 27 сентября 2019

Попробуйте этот запрос:

$query->whereHas('variants.options', function($query) use ($params) {
  $query->where(function($q){
    $q->where('options.name', '10');
    $q->orwhere('options.name', 'rose');
  })
  $query->where('inventory_quantity', '>', 0);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...