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

时间:2018-01-02 10:04:09

标签: laravel laravel-eloquent

我正在尝试在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和标题“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完全不起作用,无论我尝试什么(我知道'*'不对,但我不知道我应该把它放在数组中。)如果我删除它,我得到的确切同样的结果。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

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

  

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

答案 1 :(得分: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();