2017-01-20 4 views
0

Я прочитал несколько сообщений о том, почему загрузка с нетерпением использует несколько запросов, а не соединение 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 

Есть ли способ принять соединение и помассировать его (с помощью выбора?), Чтобы он выглядел так, как будто он был загружен?

+0

Эти 2 запросы будут возвращать разные результаты. Вы хотите использовать красноречие отношения здесь, если у человека может быть более 1 адреса или соединение, если у человека может быть только 1 адрес (соответствующий этому запросу). [Здесь] (http://laravel.io/forum/11-03-2014-withwherehas#reply-16483) - это достойный (иш) обходной путь для вашей проблемы с отношениями. – devk

+0

Если вы делаете соединение, вы не можете сделать '$ person-> address-> address_attribute', но вы можете сделать непосредственно' $ person-> address_attribute'. Атрибуты атрибута таблицы будут прикреплены к '$ person'. – devk

ответ

2

Вы можете сделать следующее:

People::join('addresses', 'addresses.people_id', '=', 'people.id') 
->selectRaw('people.*') 
->where('street_name', $street_name) 
->with('addresses') 
->get(); 

Это использует объединение и жадная загрузка.

С присоединиться в одиночку, вы можете получить доступ к следующим хотя:

$person->street_address 
+0

В идеале я бы хотел, чтобы он попал в объект, поэтому я все равно могу получить доступ к нему следующим образом: $ person-> address-> street_address, но я полагаю, что мог бы написать какой-то атрибут getter, чтобы узнать, загружен ли адрес или нет. – whiterook6

Смежные вопросы