Eloquent 关系说明

Eloquent relation clarification

以下是我的查询

 $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'); 这个地方不起作用。

您不是在过滤用户,您是在过滤 'session' 的预加载结果。无论如何,预加载对基本结果集没有任何影响。

听起来您想通过数据库中关系的 'existence' 过滤用户。

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

获取具有 'api_token' == '12345' 会话的所有用户。

Laravel 5.5 Docs - Eloquent - Relationships - Querying Relationship Existence

终于成功了。

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