Возможен ли красноречивый вложенный запрос типа «супер-нетерпеливый»?

#laravel #eloquent #eager-loading #relation #nested-queries

#laravel #красноречивый #загрузка с нетерпением #отношение #подзапрос

Вопрос:

Друзья, мой первый пост о поиске и пробовании различных решений и подходов — и, наконец, закончился здесь вопросом.

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

клиенты-> местоположения-> настройки-> схемы

Теперь мне нужен список местоположений с настройками и информацией о схеме, где выбран поставщик схемы.

Как бы я написал этот запрос с помощью eloquent? Вот что я пробовал до сих пор, но, похоже, это игнорирует предложение «where supplier»…

 $locations = Locations::with(
    ['settings' => function($query) use ($request)
        {
            $query->with(
                ['circuits' =>function($query2) use ($request)
                    {
                        $query2->where('supplier', $request->supplier);
                    }
                ]
            );                  
        }
    ])
    ->where('customer_id', $customers_id)
    ->orderBy('country')
    ->orderBy('city')
    ->get(); 
  

Я уверен, что доступны все расширения «hasMany» и «belongsTo».
Спасибо за чтение и ответ
udowsky

Обновление: рабочий код, основанный на подсказке Энвера:

 $locations = Locations::with('settings')
    ->whereHas('settings.circuits', function($query) use ($request)
        {
            $query->where('supplier', $request->supplier);
        }
        )
    ->where('customer_id', $report->customers_id)
    ->orderBy('country')
    ->orderBy('city')
    ->get();
  

Подход hasManyThrough также работает гладко:

Расширение модели местоположений:

 public function circuits()
{
    return $this->hasManyThrough('AppCircuits', 'AppSettings');
}
  

а затем используйте этот запрос:

 $locations = Locations::with('circuits')
    ->whereHas('circuits', function($query) use ($request)
        {
            $query->where('supplier', $request->supplier);
        }
    )
    ->where('customer_id', $report->customers_id)
    ->orderBy('country')
    ->orderBy('city')
    ->get();
  

Спасибо вам всем!

Комментарии:

1. Вы пробовали использовать вложенное отношение в с with('settings.circuts') или определять отношение hasManyThrough?

2. Спасибо, Харвен! — протестирован подход «with(‘настройки.схемы’), который по-прежнему приводит к тому же результату. Еще многое предстоит протестировать. Сначала нужно прочитать документацию.

Ответ №1:

Вы можете использовать вложенный запрос отношения с быстрой загрузкой.

Пример:

 $relation_sort = 'asc';
$nested_sort = 'desc';

$result = Model::with([
   'relation' => function($query) use($relation_sort){
      $query->orderBy('relation_column', $relation_sort);
   },
   'relation.nested' => function($query) use($nested_sort){
      $query->orderBy('nested_relation_column', $nested_sort);
   }
])->whereHas('relation', function($query){
    //Relation exists check.
    $query->where('price', '>', 100);
})->whereHas('relation.nested', function($query) use($search_param){
    //Nested Relation search.
    $query->where('search_column', 'LIKE', $search_param);
})->get();
  

Комментарии:

1. Спасибо Enver — это помогло! Обновит приведенный выше «вопрос» рабочим кодом на основе вашей подсказки.

2. Добро пожаловать. Если на ваш вопрос получен ответ, пожалуйста, отметьте.