2016-11-25 9 views
3

私はUserProfileの2つのモデルを1対1の関係に持っています。ラーバル5.3熱心な負荷が動作しない制限

profile.status == TRUEのすべてのユーザーを取得するには、次のコードを使用します。

$users = User::with(['profile' => function ($query) { 
     $query->where('status', TRUE); 
    }])->get(); 


    dd(count($users)); //50 

私は50人のユーザーがおり、そのうち3人だけがstatus == TRUEです。しかし、常にそれはと表示されます。

答えて

1

profileに条件を適用しているため、50人のユーザーが表示されています。 dd($user->profile)ステータスがtrueのプロファイルのレコードのみを取得します。

使用whereHas()

$users = User::whereHas('profile', function ($query) { 
     $query->where('status', TRUE); 
    })->get(); 

dd(count($users)); 
+0

ポイントをいただき、ありがとうございます –

+0

しかし、問題があります。 N + 1問合せの問題が発生しました。 –

0

あなたはそれが単一のクエリで作業したい場合、あなたはあなたがN + 1つの問題を抱えていると述べた

\DB::table('users')->join('profile', function ($join){ 
         $join->on('users.id', '=', 'profile.user_id')->where('profile.status', '=',TRUE); 
        })->get(); 
+0

ありがとう、最後に私はユーザーのテーブルに状態の列を移動し、モデルのORMクエリとその作業を使用します。 –

0

のようなクエリビルダjoinを使用することができ、このようにwhereHas()with()の両方を使用する必要があります。

$users = User::whereHas('profile', function ($query) { 
     $query->where('status', TRUE); 
    }) 
    ->with('profile') 
    ->get(); 
関連する問題