雄辩的关系澄清

时间:2017-12-08 15:20:08

标签: php laravel-5 laravel-5.5 laravel-eloquent

以下是我的查询

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

会话:hasMany与用户的关系。

我期待有会话的用户有api_token = 123456.相反,我在这里获得了所有用户。我知道我做错了什么。

我指的是doc。在文档中,它说我们可以为查询添加约束。但是这里$query->where('api_token', '=', '123456');这个地方不起作用。

2 个答案:

答案 0 :(得分:1)

您没有过滤用户,您正在过滤“会话”的热切加载结果。无论如何,急切加载对基本结果集没有任何影响。

听起来您想通过数据库中关系的“存在”来过滤用户。

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

获取所有会话的用户,其中'api_token'=='12345'。

Laravel 5.5 Docs - Eloquent - Relationships - Querying Relationship Existence

答案 1 :(得分: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();