Возможен ли красноречивый вложенный запрос? - PullRequest
1 голос
/ 14 марта 2019

Помощники, мой первый пост, поиск и пробование различных решений и подходов - и, наконец, закончился здесь, спрашивая

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

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

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

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

$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" и "ownTo". Спасибо за чтение и ответ 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 также работает плавно:

Расширение модели Locations:

public function circuits()
{
    return $this->hasManyThrough('App\Circuits', '\App\Settings');
}

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

$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 Ответ

1 голос
/ 14 марта 2019

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

Пример:

$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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...