【问题标题】:Laravel Multiple Joins with Counts (Not Eloquent)Laravel 带计数的多重连接(不是 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)。要“模仿”雄辩的行为,您可以考虑进行子查询或多个查询

标签: php mysql laravel eloquent laravel-query-builder


【解决方案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();

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2021-07-29
    • 2019-09-06
    • 2022-01-08
    • 2016-07-22
    • 1970-01-01
    • 2018-04-12
    • 2014-10-18
    相关资源
    最近更新 更多