【问题标题】:Laravel Eloquent Sum of relation's columnLaravel Eloquent Sum of relationship 的列
【发布时间】:2014-03-07 22:19:26
【问题描述】:

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

有一个用户、一个产品和一个购物车对象。

  • Cart 表仅包含以下列:iduser_idproduct_id 和时间戳。
  • UserModel hasMany Carts(因为一个用户可以存储多个产品)。
  • CartModel belongsTo 用户和 CartModel hasMany 产品。

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

我的问题是:如何获取此用户在购物车中的产品价格(产品列)的SUM()
我想用 Eloquent 来实现这一点,而不是使用查询(主要是因为我相信它更干净)。

【问题讨论】:

    标签: php laravel eloquent relation


    【解决方案1】:

    对于只想快速将列中值的总sum显示到刀片视图的用户,您可以这样做:

    {{ \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() }}
    

    【讨论】:

      【解决方案2】:

      您可以将其作为 UserModel 属性传递。将此代码添加到 UserModel。

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

      我假设是这样的:

      • UserModel 与名为 cart 的 CartModel 具有一对多关系
      • CartModel 与名为 products 的 ProductModel 具有一对多关系

      然后你可以像这样得到产品的总价:

      Auth::user()->product_price
      

      【讨论】:

      • 感谢您在 11 年后指出这一点。我想我现在可以继续这个项目了 ;)
      • @theAdmiral 喜欢看到 2025 年的时间旅行者
      【解决方案3】:

      你可以像这样使用 eloquent 轻松做到这一点

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

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

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

      【讨论】:

        【解决方案4】:

        也使用查询生成器

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

        获取表费率内所有费率值的总和。

        获取用户产品的总和。

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

        【讨论】:

          【解决方案5】:
          Auth::user()->products->sum('price');
          

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

          【讨论】:

          • 其实这是有道理的,您必须将 products 表添加到关系中,对不起。试试$sum = Auth::user()->cart()->products()->sum('price'); 或产品表中的任何价格列。
          • 我只是试图复制这个问题,我认为我们让这太难了。您的 Cart 模型实际上只是数据透视表,因此我们不必包含它,因为在 UserProduct 模型中使用您的关系方法处理了这一点。 Auth::user()->products->sum('price');。还要确保您已登录,以便 Auth 类知道要抓取哪个用户。您的购物车模型可能不应该具有 products() 函数,因为它属于这种关系的 User 模型。你真的不需要Cart 的模型。
          • 这对我有用!我停止使用购物车类。用户和产品现在都有一个 belongsToMany() 方法。现在我可以使用 price: {{ Auth::user()->products->sum('price') }} 谢谢,这个案例解决了。
          • 这里不太对劲 - 您的链接是指将聚合函数应用于数据库查询,但 products->sum 暗示它是在集合对象上调用 sum,而不是在产品返回的构建器对象上调用()。有必要澄清您在这里指的是哪一个,最好提供一个链接来解释两者。
          • @user3253002 使用不带括号的关系 ...->products->... 将查询数据库以获取当前模型的所有相关产品,然后使用该内存中的集合。使用...->products()->... 只是修改正在构建的查询而不执行它,直到调用->sum() 之类的东西。后者效率更高,因为它避免了将不必要的信息从数据库传输到内存。
          【解决方案6】:

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

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

          这将为您提供所有项目的总和。

          【讨论】:

          • 函数名其实是collect()
          • 你最好只循环数组。 collect() 用于将数组丰富为集合对象,但如果您一开始没有集合,最好只使用原始数组
          【解决方案7】:

          这不是你的答案,而是为那些来这里寻找另一个问题的解决方案的人准备的。 我想有条件地得到一列相关表的总和。 在我的数据库中 Deals 有很多活动 我想从活动表中获取“amount_total”的总和,其中activities.deal_id = deal.id 和activity.status =paid 所以我这样做了。

          $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"
          

          在交易属性中。

          这就是我想要得到的总和,而不是计数。

          【讨论】:

          • 这在许多情况下是最好的,因为您可以按它进行排序而无需获取所有记录。
          • 它工作正常,但我们必须在上面的解决方案中添加 groupBy() 方法..
          • 这是必须接受的答案
          猜你喜欢
          • 2021-03-02
          • 2017-07-23
          • 2022-01-13
          • 1970-01-01
          • 1970-01-01
          • 2021-12-03
          • 2020-03-25
          • 1970-01-01
          • 2021-11-01
          相关资源
          最近更新 更多