Laravel 带计数的多重连接(不是 Eloquent)

Posted

技术标签:

【中文标题】Laravel 带计数的多重连接(不是 Eloquent)【英文标题】:Laravel Multiple Joins with Counts (Not Eloquent) 【发布时间】:2021-11-23 07:57:05 【问题描述】:

我将把这个 Eloquent 查询转换为 Laravel 中的 DB 查询。

$users = User::withCount("addresses", "cars")->get();

以上是 Eloquent 并且运行良好。 但我想通过数据库查询来做到这一点。

我尝试如下操作,但我无法获得预期的结果。

$users = \DB::table("users")->join("addresses", "users.id", "=", "addresses.user_id")
->join("cars", "users.id", "=", "cars.user_id") 
->selectRaw("users.id, users.name, count(addresses.id) as addresses_count, count(cars.id) as cars_count")
->groupBy("users.id", "users.name")
->get();

addresses_countcars_count 的结果值相同,是2的乘积。

任何帮助将不胜感激。

【问题讨论】:

每个匹配模型的组合都会产生一行,例如对于拥有汽车 C1 和 C2 以及地址 A1、A2、A3 的用户,您将获得 6 行:(U, C1, A1), ( U,C1,A2),(U,C1,A3),(U,C2,A1),(U,C2,A2),(U,C2,A3)。要“模仿”雄辩的行为,您可以考虑进行子查询或多个查询 【参考方案1】:

您只需要在count 中添加distinct 即可:

$users = \DB::table("users")->join("addresses", "users.id", "=", "addresses.user_id")
->join("cars", "users.id", "=", "cars.user_id") 
->selectRaw("users.id, users.name, count(distinct addresses.id) as addresses_count, count(distinct cars.id) as cars_count")
->groupBy("users.id", "users.name")
->get();

【讨论】:

以上是关于Laravel 带计数的多重连接(不是 Eloquent)的主要内容,如果未能解决你的问题,请参考以下文章

多重连接 laravel 雄辩

左外连接和多重计数 SQL to LINQ

laravel 4.2 如何检查是不是有用户登录多重身份验证

Laravel:如何编写关于 belongsToMany 关系的连接计数查询?

具有多个左连接和计数的错误计算(Laravel)

Laravel Eloquent 多重求和