Laravel Query Builder groupBy 结合关系

Posted

技术标签:

【中文标题】Laravel Query Builder groupBy 结合关系【英文标题】:Laravel Query Builder groupBy combined with relationships 【发布时间】:2020-03-05 12:55:09 【问题描述】:

考虑这两个具有一对多关系的简单表:

汽车

身份证 品牌 user_id

用户

身份证 用户名

用户可以拥有多辆汽车,每辆汽车都属于一个用户。

对于每个汽车品牌,我想知道拥有最多的用户名 + 数量。

这可以通过一个 SQL 查询实现吗?我正在寻找使用 Laravel Query Builder 执行此操作的最优雅的方法?

DB::table('cars')->groupBy('brand');

是我目前所拥有的......

谢谢!

【问题讨论】:

您是否能够通过原始查询实现这一目标?如果是这样,您可以尝试将其逆向工程到各种 Builder 方法中。如果没有,那可能是一个很好的起点。目前它有点宽泛。 @TimLewis 不,我无法通过原始查询生成这个,这就是我问这个问题的原因:) 可以理解,但就像我说的,这可能是开始的地方。如果您可以在原始 SQL 中生成您期望的结果,那么您应该能够轻松地在 Eloquent (Builder) 中重现该结果,或者,如果一切都失败了,只需执行 DB::query(DB::raw(...)); 并让它执行查询你知道已经有效。其他人可能会在此期间提供帮助,但如果它很安静,看看你能做些什么:) 旁注;如果您尝试生成原始查询并遇到问题,请发布您尝试过的内容;这可能有助于澄清问题所在。 @TimLewis 谢谢蒂姆,我会努力的 ;) ! 【参考方案1】:

希望这能有所帮助。

$sub = Car::join('users', 'users.id', '=', 'cars.user_id')
->groupBy('cars.brand', 'users.id', 'users.username')
->selectRaw('users.id, 
             users.username, 
             cars.brand, 
             COUNT(cars.rand) AS brand_amount');

$count = DB::table( DB::raw("($sub->toSql()) as sub") )
    ->mergeBindings($sub->getQuery())
    ->groupBy('brand')
    ->select('brand', 'username', DB::Raw('MAX(brand_amount) AS amount'))
    ->get();

【讨论】:

谢谢,这有点工作,但仍然不是我想要的。我只需要拥有该特定品牌汽车最多的用户。例如[ 'brand' => 'brandA', 'amount' => 7, 'username' => 'john' 'brand' => 'brandB', 'amount' => 8, 'username' => ' steve' ] -- 这可能吗@TsaiKoga ? @SebSob 是的,您可以使用子查询从记录中获取最大数量。我改变了答案。 我现在收到一个错误:调用未定义的方法 Illuminate\Database\Query\Builder::getQuery() - 知道吗? @SebSob getQuery()Illuminate\Database\Query\Builder 的方法。它对我来说很好。或者您可以删除行->mergeBindings($sub->getQuery())。因为你没有 where 条件。 @SebSob 我已经解决了这个问题。使用 Eloquent\Builder Car 代替 Query\Builder。

以上是关于Laravel Query Builder groupBy 结合关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel中的Query Builder

Laravel:调用未定义的方法 Illuminate\\Database\\Query\\Builder

laravel 5.2 调用未定义的方法 Illuminate\Database\Query\Builder::associate()

“使用 Laravel 调用未定义的方法 Illuminate\\Database\\Query\\Builder::users() [关闭]

Laravel:在“query-builder”或“eloquent”中更改原始查询

在 laravel 5.3 中调用未定义的方法 Illuminate\Database\Query\Builder::attach()