查询生成器 Laravel 左连接

Posted

技术标签:

【中文标题】查询生成器 Laravel 左连接【英文标题】:Query Builder Laravel Left Join 【发布时间】:2022-01-20 13:56:11 【问题描述】:

我正在使用 laravel 8,我创建了一个查询构建器来进行左连接,当 laravel 执行查询时显示错误,但在 SQL Server MS 中执行正确

SQLSTATE[42S22]:[Microsoft][ODBC Driver 17 for SQL Server][SQL 服务器]列名“2”无效。 (SQL: select [a].[id] as [id1], [b].[id] 作为 [id2]、[a].[reg]、[a].[parte]、[a].[ubiclinea]、 [a].[描述],[a].[numConteo] 作为 [conteo1],[a].[cantidad] 作为 [cantidad1],[a].[counter] 作为 [contador1],[a].[created_at] 作为 [created1], [b].[numConteo] 作为 [conteo2], [b].[cantidad] 作为 [cantidad2], [b].[counter] as [contador2], [b].[created_at] as [created2] from [directosCount] as [a] left join [directosCount] as [b] 在 [a].[reg] = [b].[reg] 和 [b].[numConteo] = [2] 和 [b].[deleted_at] 为空,其中 [a].[numConteo] = 1 且 [a].[deleted_at] 为空)

这是显示的错误

但我复制查询并在 SQL Server 中执行,它可以工作

我在 laravel 中的查询是这样的

DB::table('directosCount as a')
->leftJoin('directosCount as b', function($join)

    $join->on('a.reg', '=', 'b.reg');
    $join->on('b.numConteo', '=', '2')->whereNull('b.deleted_at');
)
->select('a.id as id1', 'b.id as id2', 'a.reg', 'a.parte', 'a.ubiclinea', 'a.descripcion', 'a.numConteo as conteo1', 'a.cantidad as cantidad1', 'a.counter as contador1', 'a.created_at as created1', 'b.numConteo as conteo2', 'b.cantidad as cantidad2', 'b.counter as contador2', 'b.created_at as created2')
->where('a.numConteo', '1')
->whereNull('a.deleted_at')
->get();

希望有人可以帮助我

【问题讨论】:

join->on 将列而不是列与值进行比较,这需要where 来比较我假设的值 哦,好的。谢谢你的作品 @gutiec - 很高兴知道您解决了问题,发布您自己问题的答案,这样它就不会显示为未回答。 【参考方案1】:

我认为这应该在加入之外

$join->on('b.numConteo', '=', '2')->whereNull('b.deleted_at');

请将on改为where

->where('b.numConteo', '=', '2')->whereNull('b.deleted_at');

【讨论】:

【参考方案2】:

您的联接中有 2 个 on 语句。试试这个

DB::table('directosCount as a')
->leftJoin('directosCount as b', function($join)

    $join->on('a.reg', '=', 'b.reg')
       ->where('b.numConteo', '=', '2')
       ->whereNull('b.deleted_at');
)
->select('a.id as id1', 'b.id as id2', 'a.reg', 'a.parte', 'a.ubiclinea', 'a.descripcion', 'a.numConteo as conteo1', 'a.cantidad as cantidad1', 'a.counter as contador1', 'a.created_at as created1', 'b.numConteo as conteo2', 'b.cantidad as cantidad2', 'b.counter as contador2', 'b.created_at as created2')
->where('a.numConteo', '1')
->whereNull('a.deleted_at')
->get();

【讨论】:

以上是关于查询生成器 Laravel 左连接的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 使用查询生成器进行嵌套连接查询

laravel 查询生成器:连接依赖于主要内容

具有多态连接的 Laravel 查询生成器在 SQLite 上不起作用

Laravel 在连接结果上不同,在查询生成器中不起作用

使用 Laravel Query Builder 进行复杂的 MySQL 内连接查询

Laravel 查询生成器/如何阻止它添加方 [括号]?