関係の列のLaravel Eloquent Sum


111

shoppingcartアプリケーションを開発してきましたが、次の問題が発生しました。

ユーザー、製品、カートオブジェクトがあります。
-Cartテーブルには、「id」、「user_id」、「product_id」、およびタイムスタンプの列のみが含まれています。
-UserModelの「hasMany」カート(ユーザーが複数の製品を保管できるため)。
-CartModel「belongsTo」ユーザーおよびCartModel「hasMany」製品。

次に、製品の合計を計算するために、次のように呼び出しますAuth::user()->cart()->count()

私の質問は、このユーザーがカートに入れている製品の価格(製品の列)のSUM()を取得するにはどうすればよいですか?
私はこれをEloquentで実現し、クエリを使用することではなく実現したいと考えています(主にそれがよりクリーンであると信じているため)。

回答:


220
Auth::user()->products->sum('price');

ドキュメントは、いくつかのCollectionメソッドについては少し軽いですが、すべてのクエリビルダー集約はhttp://laravel.com/docs/queries#aggregatesavg()で見つけることができる以外に利用できるようです。


すごい返事ありがとうございます。現在は、価格列はないというだけです。雄弁な人はそのProductテーブルをまったく見ていないようです...
theAdmiral 14

3
実際にはそれは理にかなっています、関係に製品テーブルを追加する必要があります。試してみる$sum = Auth::user()->cart()->products()->sum('price');か、商品の表にある価格列を確認してください。
user1669496 2014

1
それは私のために働いた!カートクラスの使用をやめました。ユーザーと製品の両方に、belongsToMany()メソッドが追加されました。これで、priceを使用できるようになりました:{{Auth :: user()-> products-> sum( 'price')}}ありがとう、このケースは解決されました。
アドミラル2014

9
何かが正しくありません-リンクはデータベースクエリへの集約関数の適用を参照していproducts->sumますが、products()によって返されたビルダーオブジェクトではなく、コレクションオブジェクトの呼び出し合計であることを意味しています。ここでどちらを意味するのかを明確にし、両方を説明するリンクを提供するのが理想的です。
Benubird 2014年

1
@ user3253002括弧なしの関係を使用すると...->products->...、データベースにクエリを実行して、現在のモデルの関連製品をすべて取得し、そのメモリ内コレクションを操作します。を使用...->products()->...すると、作成されるクエリが変更されるだけで、そのようなもの->sum()が呼び出されるまで実行されません。後者は、データベースからメモリへの不要な情報の転送を回避するため、より効率的です。
シーゲン

62

これはあなたの答えではありませんが、別の問題の解決策を探してここに来る人々のためのものです。関連するテーブルの列の合計を条件付きで取得したかった。私のデータベースでは、Dealsには多くのアクティビティがあります。Activitiesテーブルから「amount_total」の合計を取得する必要がありました。

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

取引属性。

これは今では数えたくなかった合計です。


3
すべてのレコードを取得せずに並べ替えることができるため、多くの場合これが最適です。
サブリナレゲット2018年

15

同様のことを試みましたが、collect()関数を理解するまでにかなりの時間がかかりました。だからあなたはこのように何かを持つことができます:

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

これにより、すべてのアイテムの合計が得られます。


4
関数の名前は実際にはcollect()
Leonardo Beal

配列をループするだけのほうがいいでしょう。collect()は配列をコレクションオブジェクトに拡張するために使用されますが、最初にコレクションがない場合は、生の配列を使用する方がよい場合があります
Flame

0

クエリビルダーも使用

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

テーブルレート内のすべてのレート値の合計を取得します。

ユーザー製品の合計を取得します。

DB::table("users")->get()->sum("products")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.