Модель запросов Laravel Eloquent, которая имеет ровно несколько ассоциаций в n-m-отношениях - PullRequest
2 голосов
/ 20 июня 2019

У меня есть проект, в котором у меня есть следующие модели:

  • Продукты
  • FeatureTypes
  • Особенности
  • Варианты

И таблицы и отношения следующие:

Database Schema Diagram

У меня есть запрос, где я хочу получить Variants из Product с некоторым конкретным Features. Variant может иметь 1 или много Features, но я хочу получить все Variants, если я дам один Feature, и выполнить более точный поиск по Variants, если я дал больше Features, пока я иметь только один Variant, который может иметь только один набор определенных Feature.

Вот код, который у меня сейчас есть:

$variants =  $product
->variants()
->whereHas('features', function($query) {
    $query->whereIn('id', json_decode(request('features')));
})
->with('features', 'features.featureType')
->get();  

request('features') содержит строковый массив с идентификаторами Features.

Я использовал метод Eloquent whereIn, полагая, что он даст мне только те варианты, которые содержат в точности все Features, указанные в запросе.

Но при повторной проверке документации я вижу, что она вернет все Variants, для которых в запросе указан хотя бы один Feature, что здесь не то, что мне нужно.

Как я могу сделать запрос этого Eloquent, чтобы вернуть мне только Variants, которые связаны со всеми Features, указанными в запросе?

Заранее спасибо за помощь! ;)

1 Ответ

3 голосов
/ 20 июня 2019

whereHas() принимает четвертый аргумент с количеством строк:

$variants = $product
    ->variants()
    ->whereHas('features', function($query) use ($features) {
        $query->whereIn('id', $features);
    }, '=', count($features))
    ->with('features', 'features.featureType')
    ->get();
...