繁体   English   中英

如何对多个字段进行分组,包括嵌套的渴望列

[英]How to group on multiple fields including nested eager columns

我有一些购物车、产品和用户。 我尝试获取每个用户的购物车数量等统计信息。 这是我的模型:

  • 用户.php

     class User { public function products() { return $this->hasMany(Product::class, 'user_id'); } }
  • 购物车.php

     class Cart { public function products() { return $this->hasMany(Product::class, 'cart_id'); } }
  • 产品.php

     class Product { public function user() { return $this->belongsTo('User', 'user_id'); } public function cart() { return $this->belongsTo(Cart::class, 'cart_id'); } }

这是我的查询:

$query = Cart::query()
        ->whereHas('products', function ($query) use ($filter) {
            $query->where('whatever', $filter);
        })
        ->join('product', 'product.cart_id', '=', 'cart.id')
        ->join('users', 'users.id', '=', 'product.user_id')
        ->groupBy('users.id')
        ->select('users.id as user_id')
        ->select('users.name')
        ->selectRaw('count(cart.id) as numberOfCarts')
        ->selectRaw('SUM(price)')
        ->orderBy('users.name')
        ->get();

我得到的是每个用户的产品数量,但我想要每个用户的购物车数量。 当我尝试使用像groupBy groupBy(['user.id', 'cart.id'])类的 cart.id 进行分组时,情况更糟:我获得了多次相同的用户,并且每次都获得了购物车中的产品数量。 这个总数与之前获得的购物车总数相同。

我添加了关节,因为我没有通过尝试对嵌套的渴望关系进行分组来使其工作。 所以我让它变得更简单。

如何修复分组以计算用户购物车而不是他们的产品?

问题是count()计算MySQL 查询返回的记录数,所以如果您查看 20 行都具有相同的cart.id ,它仍然会计算所有 20 行。

您可以通过仅计算具有distinct的唯一cart.id来将其减少到您想要的:

$query = Cart::query()
        ->whereHas('products', function ($query) use ($filter) {
            $query->where('whatever', $filter);
        })
        ->join('product', 'product.cart_id', '=', 'cart.id')
        ->join('users', 'users.id', '=', 'product.user_id')
        ->groupBy('users.id')
        ->select('users.id as user_id')
        ->select('users.name')
        ->selectRaw('count(distinct cart.id) as numberOfCarts') // << Changed line
        ->selectRaw('SUM(price)')
        ->orderBy('users.name')
        ->get();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM