【问题标题】:Laravel eloquent where clause if relation is not null如果关系不为空,Laravel 雄辩的 where 子句
【发布时间】:2020-12-15 08:11:14
【问题描述】:

我有这个问题:

$answers = AnswerVersion::query()->with(['answer' => function($q) use ($project) {
    $q->where(['project_id' => $project->id]);
}]);

我想添加修改它以仅返回实际具有 answer 关系的 AnswerVersion 结果。现在它只在存在答案关系时查询 project_id 匹配,否则忽略该查询并返回 AnswerVersion 无论如何。有没有办法我可以在回调中做到这一点,或者基本上是关系上的whereNotNull?我无法翻转查询,因为我需要从 CSV 报告的 AnswerVersion 关系中获取它,所以我知道来自 Answer -> AnswerVersion 其中 project_id 是匹配项最有意义的 SQL 方式。但是,这不适用于此报告,因为每个 AnswerVersion 都需要一行,其中包含 Answer 信息。原始 SQL 查询看起来像这样:

SELECT
   * 
FROM
   answer_versions AS AV 
   INNER JOIN
      answers AS A 
      ON AV.answer_id = A.id 
WHERE
   A.project_id = 1;

【问题讨论】:

标签: mysql laravel eloquent eloquent-relationship laravel-6.2


【解决方案1】:

您在帖子中显示的 sql 查询将为您提供属于 answeranswer_versions,其中 project_id 为 1,并且您从查询构建器获得的查询将获取所有 answer_versions,而不管它们的相关答案是否属于项目 1。

但在结果集中,您将获得一些answer_versions 的答案,因为您在with() 中应用了过滤器,它只加载相关记录。

为了获得与提供的 sql 查询相同的结果,您需要在主子句上使用过滤器,而不是在 with() 中应用过滤器

$answers = AnswerVersion::query()->with('answer')
            ->whereHas('answer.project', function ($query) use ($project) {
                $query->where('project_id' ,$project->id);
           });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 2015-05-17
    • 2014-11-05
    • 1970-01-01
    • 2018-05-19
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多