Laravel5 Eloquent WhereNotIn没有做我期望的事情

问题描述 投票:0回答:2

我正在尝试在Eloquent中转换以下SQL查询:

SELECT id, title FROM chapters
JOIN chapters_has_parents
WHERE chapters.id = chapters_has_parents.parents_id
AND chapters.id
NOT IN ( SELECT children_id FROM chapters_has_parents)

根据需要返回id 1和title“introduction”。

我尝试了很多选项,但找不到正确的查询。这是我的代码:

$startingChapter = Chapter::join('chapters_has_parents','chapters.id', '=', 'chapters_has_parents.parents_id')
->whereNotIn('chapters_has_parents.children_id', ['*'])
->get(['chapters.id', 'chapters.title']);

whereNotIn完全不起作用,无论我尝试什么(我知道'*'不对,但我不知道我应该把它放在数组中。)如果我删除它,我会得到完全相同的结果。

我究竟做错了什么 ?

laravel laravel-eloquent
2个回答
0
投票

您可以使用内部回调,但是您必须进行第二次查询。

whereIn(“id”,function($ q){return $ query-> select(“children_id”) - > from(“chapter_has_parents”) - > get();})


0
投票

Source

查询关系缺席

访问模型的记录时,您可能希望根据缺少关系来限制结果。例如,假设您要检索所有没有任何评论的博客帖子。为此,您可以将关系的名称传递给doesntHave和orDoesntHave方法:

$posts = App\Post::doesntHave('comments')->get();

如果您需要更多功能,可以使用whereDoesntHave和orWhereDoesntHave方法在didntHave查询中放置“where”条件。这些方法允许您向关系约束添加自定义约束,例如检查注释的内容:

$posts = Post::whereDoesntHave('comments', function ($query) {
    $query->where('content', 'like', 'foo%');
    })->get();
© www.soinside.com 2019 - 2024. All rights reserved.