web-dev-qa-db-ja.com

Laravel Eloquent-結果のフィルタリングと熱心に読み込まれた結果

だからここにユースケースがあります:

あなたにはユーザーがいて、彼らには多くのアドレスがあります。住所をフィルタリングして積極的にロードしたいとします(たとえば、米国の住所のみ)。そのためには、whereHasを使用して熱心な負荷とフィルターをフィルターする必要があるため、結果セットは米国の住所を持つユーザーのみであり、米国の住所のみが返されます。これは少し不格好です。

次に例を示します。

(new App\User)
    ->with(['address' => function(){/* filter code */}])
    ->whereHas('address', function(){/* pretty much the same filter code */})
    ->get()

これを行うより良い方法はありますか?何かが足りないような気がします。

6
Bill Garrison

whereHaswithは混乱しています。

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を返す関係「アドレス」を持つユーザーのみを返します。

4

あなたはあなたがのようなカスタムの関係を作成できることを知っていますか? :

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

このようにして、フィルターは既に準備されています。 (:

0
Lucas