这是我的架构:
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()
添加到子查询中,它为我提供了具有两个公共答案的用户正确的数据,但对于第二个用户,它返回了一个空集合。如果有人有任何想法,将不胜感激。谢谢!
答案 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())
)进行过滤,结果将只是第一个问题的第一个公开答案,这没有任何意义。