簡體   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