だからここにユースケースがあります:
あなたにはユーザーがいて、彼らには多くのアドレスがあります。住所をフィルタリングして積極的にロードしたいとします(たとえば、米国の住所のみ)。そのためには、whereHas
を使用して熱心な負荷とフィルターをフィルターする必要があるため、結果セットは米国の住所を持つユーザーのみであり、米国の住所のみが返されます。これは少し不格好です。
次に例を示します。
(new App\User)
->with(['address' => function(){/* filter code */}])
->whereHas('address', function(){/* pretty much the same filter code */})
->get()
これを行うより良い方法はありますか?何かが足りないような気がします。
whereHas
とwith
は混乱しています。
with
メソッドを使用すると、クエリがtrueを返した場合にのみ関係をloadできます。
whereHas
メソッドを使用すると、getクエリにtrueを返す関係を持つモデルのみを使用できます。
だからここ:
(new App\User)->with(['address' => function($query){// filter code}])->get();
すべてのユーザーを返しますが、フィルターコードがtrueを返したときにのみ、積極的にアドレスをロードします。
そしてここ :
(new App\User)->whereHas(['address' => function($query){// filter code}])->get();
フィルターコードでtrueを返す関係「アドレス」を持つユーザーのみを返します。
あなたはあなたがのようなカスタムの関係を作成できることを知っていますか? :
class User extends Model implements...
{
....
function USAddresses(){
return $this->
belongsToMany(User::class,UserAddresses::class,'user_id','address_id')
->withPivot('postal_code')
->wherePivot('postal_code', !null );
}
} // end model
あなたのコントローラーで:
$this->users->with('USAddresses')->whereHas(...)->get();
このようにして、フィルターは既に準備されています。 (: