Я прочитал несколько сообщений о том, почему загрузка с нетерпением использует несколько запросов, а не соединение here, here и here. Тем не менее, у меня есть ситуация, которая, как мне кажется, требует использования соединения вместо активной загрузки. Как мне построить запрос, чтобы я мог получить доступ к под-объекту, как если бы он был нормально загруженным объектом?Могу ли я поддельную загрузку laravel с помощью соединения?
Пример: Получение людей, живущих на определенной улице, и загрузка этого адреса одновременно. Я не хочу загружать все адреса человека, если он живет во многих местах; просто места, соответствующие запросу. С жадным погрузкой и whereHas я должен дублировать запрос, и это не всегда так просто из запроса:
People::with(['address', function($query) use ($street_name){
return $query->where('street_name', $street_name);
}])->whereHas('address', function($query) use ($street_name){
return $query->where('street_name', $street_name);
})->get();
может быть
People::query()->join('address', function($join){
$join->on(...)
})->where('street_name', $street_name);
тогда Проблема заключается в том, что я не могу использовать это:
$person->address
Есть ли способ принять соединение и помассировать его (с помощью выбора?), Чтобы он выглядел так, как будто он был загружен?
Эти 2 запросы будут возвращать разные результаты. Вы хотите использовать красноречие отношения здесь, если у человека может быть более 1 адреса или соединение, если у человека может быть только 1 адрес (соответствующий этому запросу). [Здесь] (http://laravel.io/forum/11-03-2014-withwherehas#reply-16483) - это достойный (иш) обходной путь для вашей проблемы с отношениями. – devk
Если вы делаете соединение, вы не можете сделать '$ person-> address-> address_attribute', но вы можете сделать непосредственно' $ person-> address_attribute'. Атрибуты атрибута таблицы будут прикреплены к '$ person'. – devk