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_count
和cars_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 4.2 如何检查是不是有用户登录多重身份验证