Laravel雄辩的where子句若关系不为空



我有这个查询:

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

我想添加并修改它,使其仅返回实际具有answer关系的AnswerVersion结果。现在,它只在存在答案关系时查询project_id匹配,否则忽略该查询并返回AnswerVersion。有没有一种方法可以在回调中做到这一点,或者本质上是关系上的whereNotNull?我无法翻转查询,因为我需要从CSV报告的AnswerVersion关系中找到它,所以我理解来自Answer->其中project_id是匹配项的AnswerVersion在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;

您在文章中显示的sql查询将为您提供属于answeranswer_versions,其中project_id为1,而您从查询生成器中获得的查询将获取所有answer_versions,无论它们的相关答案是否属于项目1。

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

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

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

相关内容

  • 没有找到相关文章

最新更新