2017-01-20 15 views
0

herehere、およびhereに参加するのではなく、複数のクエリを使用する理由についていくつかの記事を読んでいます。しかし、私は、熱心なロードの代わりに参加を使用することを保証すると思う状況があります。あたかも読者が普通に読んでいるオブジェクトのようにサブオブジェクトにアクセスできるように、私はどのようにしてクエリを構築しますか?ジョインを使用してLaravel eager loadingを偽装できますか?

例:特定の通りに住んでいる人を取得し、同時にそのアドレスを読み込みます。私は彼が多くの場所に住んでいる場合、すべての人の住所をロードしたくない。クエリに一致する場所のみ。

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); 

ことができます:積極的なロードとwhereHasで、私は、クエリを複製する必要があり、それは常に、クエリのこの単純ではありません

$person->address 

ジョイントしてマッサージする方法はありますか?(選択を使用しますか?)これはロードされたように見えますか?

+0

これらの2つのクエリは異なる結果が返されます。人が1つ以上のアドレスを持つことができる場合、または人が1つのアドレスのみを持つことができる場合(このクエリに一致する)、ここで雄弁な関係を使用したいと考えています。 [Here](http://laravel.io/forum/11-03-2014-withwherehas#reply-16483)は、関係に関する問題の適切な(ish)回避策です。 – 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のようにアクセスできますが、アドレスがロードされているかどうかを知るために何らかの属性ゲッターを書くことができます。 – whiterook6

関連する問題