[英]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.