【问题标题】:Laravel subquery relationshipLaravel 子查询关系
【发布时间】:2020-03-16 07:11:41
【问题描述】:

这是我的架构:

User 型号正常。

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

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

我需要为除经过身份验证的用户之外的每个用户获取问题的主要答案。以下是我目前对问题模型的了解:

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

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

【问题讨论】:

  • 正确使用关系用户问题联络

标签: php sql database laravel eloquent


【解决方案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())) 进行过滤,结果将只是第一个问题的第一个公开答案,这没有任何意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2017-07-19
    • 2021-05-27
    • 2020-06-26
    相关资源
    最近更新 更多