2017-12-08 3 views
0

は私のクエリ雄弁関係の明確化

$user = User::with(['session' => function ($query) { 
      $query->select('id','device_id'); 
      $query->where('api_token', '=', '123456'); 
      }])->get(); 

セッションです。

私は、セッションがapi_token = 123456であると予想しています。代わりに、ここで全ユーザを取得しています。私は何か間違っていることを知っています。

私はこれを参照していますdoc。このドキュメントでは、クエリに制約を追加できると言っています。しかし、ここでは$query->where('api_token', '=', '123456');これは動作しません。

答えて

0

最後に、私はそれが働いていたました。

$sessionSelect = function ($query) { 
     return $query->select('user_id', 'device_id'); 
}; 
$detailSelect = function ($query) { 
     return $query->select('user_id', 'dob', 'gender'); 
}; 
$sessionWhere = function ($query) use ($key) { 
     return $query->where('api_token', $key); 
}; 
$users = User::with(['session' => $sessionSelect,'detail'=>$detailSelect]) 
      ->whereHas('session', $sessionWhere) 
      ->first(); 
1

あなたはユーザーをフィルタリングしていないので、あなたは 'セッション'を熱心に読み込んだ結果をフィルタリングしています。 Eagerローディングは、とにかく基本結果セットに影響を与えません。

データベース内の関係の「存在」によってユーザーをフィルタするように思えます。

User::whereHas('session', function ($q) { 
    $q->where('api_token', '12345'); 
})->get(); // ->first(); 

'api_token' == '12345'のセッションを持つすべてのユーザーを取得します。

Laravel 5.5 Docs - Eloquent - Relationships - Querying Relationship Existence

+0

しかし、どのようにセッションの詳細を取得できますか?私はこの$ q-> select(['id'、 'device_id'])を試しました。セッションの詳細を取得しない –

+0

'whereHas'はレコードを取得するためのものではなく、関係の存在に基づいてフィルタリングするためのものです...' with' eagerがロードされると、関係に使用されるキーを選択する必要があります...もし、それは彼らの親に戻ってレコードを一致させることはできません – lagbox