【问题标题】:Laravel. Using WHERENOTIN拉拉维尔。使用 WHERENOTIN
【发布时间】:2016-12-12 18:26:16
【问题描述】:

基本上我想在 Laravel 中构建 tihs 查询,但它不起作用。

SELECT films.id, films.name AS film
FROM films
WHERE films.id NOT IN 
(   
    SELECT films.id
    FROM actors, actor_film, films
    WHERE actors.id = actor_film.actor_id
    AND actor_film.film_id = films.id
    GROUP BY films.id
 )
 ORDER BY films.id DESC
 LIMIT 600
;

使用“whereNotIn”我编写了以下两个查询: 第一个获取数据库中至少有一个这样关联的演员的所有电影:

    $films_with_actors = DB::table('films')
        ->join('actor_film', 'actor_film.film_id', '=', 'films.id')
        ->join('actors', 'actors.id', '=', 'actor_film.actor_id')
        ->select( 'films.id')
        ->groupBy('films.id')
        ->get();

现在我想获取没有关联演员的电影。为此,我正在尝试获取上一个方法中未包含的 ID,如下所示:

    $films_with_no_actors = DB::table('films')
        ->whereNotIn('films.id', $films_with_actors)
        ->orderBy('films.id', 'desc')
        ->take(500)
        ->get();
        -

有什么帮助吗?

【问题讨论】:

    标签: mysql laravel query-builder


    【解决方案1】:

    我正在根据您共享的代码为您提供一个基本解决方案。

    在 laravel 中,您有一个名为 pluck 的方法,用于检索具有给定键的所有值的数组。

    因此,您只能获取 $films_with_actors 的 ID。类似于(基于您的第一个查询):

    $films_with_actors = DB::table('films')
        ->join('actor_film', 'actor_film.film_id', '=', 'films.id')
        ->join('actors', 'actors.id', '=', 'actor_film.actor_id')
        ->select( 'films.id')
        ->groupBy('films.id')
        ->pluck('id')->toArray();
    

    现在您有了一个包含 id 的数组,您可以将该数组包含在第二个查询的 whereNotIn 子句中:

        $films_with_no_actors = DB::table('films')
        ->whereNotIn('films.id', $films_with_actors)
        ->orderBy('films.id', 'desc')
        ->take(500)
        ->get();
    

    【讨论】:

    • 谢谢。但这是否意味着我必须运行两个查询?不能像在 MySQL 中那样将一个嵌入另一个中?
    • 不用担心,您可以在创建第一个查询后调用它,它会起作用。做类似的事情: $films_with_actors_ids = $films_with_actors->pluck('id')->toArray();
    猜你喜欢
    • 2018-05-10
    • 1970-01-01
    • 2020-03-29
    • 2018-09-11
    • 2022-11-24
    • 1970-01-01
    • 2018-05-26
    • 2018-02-13
    • 2019-12-25
    相关资源
    最近更新 更多