Laravel雄辩的和关系数量和分组

时间:2019-07-01 08:41:40

标签: laravel eloquent

产品表:

id        name
1     first product

product_credits表:

id   product_id   quantity
1         1          10
2         1          20

我正在尝试做的事情:

我正在尝试获取所有 产品数量

预期数据:

获取:

  • 产品名称=第一个产品
  • 产品数量= 30

模型关系代码:

public function credits () {
    return $this -> hasMany('App\Models\Product\ProductCredits')
        -> whereHas('importInvoice', function ($query) {
            $query->where('deleted_at', null);
        }) -> orderBy('created_at', 'ASC') -> orderBy('quantity', 'DESC');
}

这种关系很好。

我尝试过的事情:

我尝试过雄辩地使用with函数。

public function exportProductsCredit(Request $request) {
    // GET THE COLLECTION
    $products = Product::with(['credits' => function ($query) {
        $query -> where('quantity', '>', 1) -> groupBy('product_id') -> sum('quantity');
    }]) -> get();

    return $products;
}

但是它抛出错误:product_credits.id' isn't in GROUP BY

编辑

问题是我有Mutator字段要显示,例如,我计算了product_net_price,并将其作为增变器返回。

2 个答案:

答案 0 :(得分:1)

如果您希望将其作为属性,请不要尝试像建立关系那样查询构建。

您可以在Product::class

中声明这样的属性
public function getSumCreditsAttribute()
{
    return $this->credits->where('quantity', '>', 1)->sum('quantity');
}

您还可以始终使用appends属性加载它

protected $appends = ['sum_credits'];

或在您拥有Product::class实例时访问它

$products = Product::get();
foreach ($products as $product) {
    var_dump($product->sum_credits);
}

答案 1 :(得分:0)

由于我们无法使用模型来实现分组和聚合。您需要使用以下方式

Product::join('product_credits as pc', 'products.id', '=', 'pc.product_id')
        ->select('products.id', 'products.name', DB::raw("SUM(pc.quantity) as 'product_quantity'"))
        ->with('credits')
        ->where('pc.quantity', '>', 1)
        ->groupBy('pc.product_id')
        ->get();

希望这对您有所帮助。