如何使用 Laravel 的查询构建器执行嵌套连接?

Posted

技术标签:

【中文标题】如何使用 Laravel 的查询构建器执行嵌套连接?【英文标题】:How do I perform nested joins using Laravel's query builder? 【发布时间】:2018-07-17 03:37:00 【问题描述】:

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


我正在使用 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]

【问题讨论】:

我相信这个功能不存在,除了编写原始 SQL 之外似乎没有其他解决方法。我创建了一个拉取请求,希望能纠正它。 github.com/laravel/framework/pull/23059 伟大的贡献! 【参考方案1】:

这使它进入了 Laravel 5.6.1

【讨论】:

以上是关于如何使用 Laravel 的查询构建器执行嵌套连接?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:嵌套查询连接导致子数组

在执行查询之前,如何从 Laravel 的查询构建器中获取原始查询字符串?

Laravel 查询生成器。返回嵌套结构化数据

Laravel 查询构建器与 where 左外连接

使用 Laravel 的查询构建器或 Eloquent 将一个表与一个临时表进行内部连接

使用 laravel 查询生成器嵌套选择?