关系列的雄辩和

我一直在开发一个购物车应用程序,现在我遇到了以下问题。

有一个 User、一个 Product 和一个 Cart 对象。

  • Cart 表只包含以下列: iduser_idproduct_id和时间戳。
  • UserModelhasMany购物车(因为用户可以存储多个产品)。
  • CartModel belongsTo a 用户和 CartModel hasMany产品。

现在计算总产品,我可以只调用: Auth::user()->cart()->count()

我的问题是: 我怎样才能得到的 SUM()的价格(一栏产品)的车的产品由该用户?
我想完成这与雄辩,而不是通过使用查询(主要是因为我相信它是干净得多)。

441606 次浏览
Auth::user()->products->sum('price');

文档对于某些 Collection方法来说有些简单,但是除了 avg()之外,所有的查询构建器聚合似乎都可以在 http://laravel.com/docs/queries#aggregates中找到。

我尝试做了一些类似的事情,这花了我很长时间才弄明白了 Collection ()函数。所以你可以这样做:

collect($items)->sum('amount');

这会给你所有项目的总和。

这不是你的答案,而是那些来这里寻找解决方案的人的答案。 我想有条件地得到一列相关表的和。 在我的数据库交易有许多活动 我希望从 Activity 表中获得“ amount _ total”的总和,其中 activties.deal _ id = deal.id 和 activties.status = pay 所以我这么做了。

$query->withCount([
'activity AS paid_sum' => function ($query) {
$query->select(DB::raw("SUM(amount_total) as paidsum"))->where('status', 'paid');
}
]);

它回来了

"paid_sum_count" => "320.00"

在 Deals 属性中。

这就是我现在想要得到的数目。

也在使用查询生成器

DB::table("rates")->get()->sum("rate_value")

以获得表中所有速率值的总和。

获取用户产品的总和。

DB::table("users")->get()->sum("products")

你可以用这样的口才轻松地做到这一点

$sum = Model::sum('sum_field');

它将返回一个字段的和, 如果应用条件也很简单

$sum = Model::where('status', 'paid')->sum('sum_field');

可以将此代码作为 UserModel 属性传递。

public function getProductPriceAttribute(){
return $this->cart()->products()->sum('price');
}

我假设是这样的:

  • UserModel 与名为 手推车的 CartModel 具有一对多关系
  • CartModel 与 ProductModel 有一个名为 产品的一对多关系

然后你可以得到这个产品的总价如下:

Auth::user()->product_price

对于那些只想在刀片视图中快速显示列中值的总 总数的人,您可以这样做:

\{\{ \App\Models\ModelNameHere::sum('column_name') }}

你也可以为 平均水平做:

\{\{ \App\Models\ModelNameHere::avg('column_name') }}

最小:

\{\{ \App\Models\ModelNameHere::min('column_name') }}

麦克斯:

\{\{ \App\Models\ModelNameHere::max('column_name') }}

去拿 一张桌子的数目:

\{\{ \App\Models\ModelNameHere::count() }}

自从版本8以来,Eloquent 上有一个 withSum方法,所以您可以使用这个。

Auth::user()->withSum('products', 'price')->products_sum_price;

这不会将所有的产品加载到内存中,然后用集合方法对其进行求和。相反,它将为数据库生成一个子查询,因此速度更快,使用的内存更少。