php - 如何对多个字段进行分组,包括嵌套的急切列

标签 php laravel orm eager-loading

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

  • user.php

    class User {
        public function products()
        {
            return $this->hasMany(Product::class, 'user_id');
        }
    }
    
  • cart.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(['user.id', 'cart.id']) 这样的 cart.id 进行分组时,情况更糟:我得到了好几倍同一用户和每次购物车中的产品数量。这个总数与之前获得的购物车总数相同。

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

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

最佳答案

问题是 count() 计算返回的记录数 by your MySQL query ,因此,如果您正在查看全部具有相同 cart.id 的 20 行,它仍然会计算所有 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();

关于php - 如何对多个字段进行分组,包括嵌套的急切列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72945328/

相关文章:

javascript - 在 Laravel 上异步加载 Vue 组件

android - Laravel 中的 AES 256 CBC 加密和 android 中的解密

php - 如何在 laravel 中以编程方式即时设置 .env 值

java - 在 Hibernate 中检索特定字段的值

php - 从包含的子文件(php)访问父文件中的命名空间

php - MySQL 选择 20.000 行

java - 本地 H2 服务器 + hibernate : existing database is not visible

python - 为什么使用带有 NoSql 的 ORM(如 MongoDB)

PHP MySQL 内连接问题

php - 无法正确获取边距