代码之家  ›  专栏  ›  技术社区  ›  Tyler Clendenin

如何使用Laravel的查询生成器执行嵌套联接?

  •  2
  • Tyler Clendenin  · 技术社区  · 7 年前

    编辑:为了澄清,我想得到所有节点,无论它们是否有图像。此外,如果图像中没有相应的记录,我不想从Images\u节点返回任何记录。这是一个更复杂查询的简化版本,所以不要告诉我我的数据库设计不正确。


    我使用的是Laravel 5.5,想做一个稍微复杂一点的查询。

    select
        n.Node_id, i.Image_id
    from
        Nodes AS n
        left join Nodes_Images AS n_i
            join Images i ON n_i.Image_id = i.Image_id
        ON n.Node_id = n_i.Node_id
    

    我以为

    DB::table('Nodes AS n')
        ->leftJoin('Nodes_Images AS n_i', function ($join) {
            $join->on('n.node_id', '=', 'n_i.node_id')
                ->join('images AS i', 'n_i.image_id', '=', 'i.image_id');
        })->select('n.node_id', 'i.image_id');
    

    会产生它,但它会回来

    select
        [n].[node_id], [i].[image_id]
    from
        [Nodes] as [n] 
        left join [Nodes_Images] as [n_i] 
        on [n].[node_id] = [n_i].[node_id]
    

    还有这个

    DB::table('Nodes AS n')
        ->leftJoin('Nodes_Images AS n_i', 'n.node_id', '=', 'n_i.node_id')
        ->join('images AS i', 'n_i.image_id', '=', 'i.image_id')
        ->select('n.node_id', 'i.image_id');
    

    生成此连接,它不会将图像连接嵌套在外部连接内

    select
        [n].[node_id], [i].[image_id]
    from
        [Nodes] as [n]
        left join [Nodes_Images] as [n_i] on [n].[node_id] = [n_i].[node_id] 
        inner join [images] as [i] on [n_i].[image_id] = [i].[image_id]
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Tyler Clendenin    6 年前

    这使其成为Laravel 5.6.1