Laravel子查询关系

时间:2019-11-20 14:19:58

标签: php sql database laravel eloquent

这是我的架构:

User模型是正常的。

Question
  - team_id
  - question_body
Answer
  - user_id
  - question_id
  - order
  - is_private

对于一个问题,用户可以有一个主要答案,该答案本质上是顺序最低且公开的答案。

除了已通过身份验证的用户,我需要为每个用户获取问题的主要答案。到目前为止,这是我对Question模型的了解:

return User::with(['answers' => function ($query) {
    return $query->where('question_id', $this->getKey())
        ->orderBy('order')
        ->public();
}])
   ->where('id', '!=', Auth::user()->getKey())
   ->get();

在测试中,我正在创建一个有两个公共答案的用户,另一个用户有一个私人答案,然后是一个公共答案。第二个用户的私人答案的顺序较低。当我运行测试时,我得到用户对order排序的给定问题的所有公开答案。我只想要第一个,所以我将first()添加到子查询中,它为我提供了具有两个公共答案的用户正确的数据,但对于第二个用户,它返回了一个空集合。如果有人有任何想法,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:-1)

最好的做法是在User::class

中声明一个新关系
lass User extends Authenticatable
{
    public function publicAnswer()
    {
        $query = Answer::orderBy('order', 'asc')->public();
        return $this->newHasOne($query, Answer::class, 'user_id', 'id');
    }
}

然后您可以在查询中使用此关系

return User::with(['publicAnswer' => function ($query) {
    return $query->where('question_id', $this->getKey());
}])
   ->where('users.id', '!=', Auth::user()->getKey())
   ->get();

区别在于用户的public_answer属性将不是集合,而是Answer::class(或null)的实例

这里的问题是,如果不使用question_id$query->where('question_id', $this->getKey()))进行过滤,结果将只是第一个问题的第一个公开答案,这没有任何意义。