web-dev-qa-db-fra.com

Laravel Eloquent Sum de la colonne de la relation

J'ai travaillé sur une application de panier d'achat et je suis maintenant arrivé au problème suivant.

Il y a un utilisateur, un produit et un objet Cart.
- La table Cart contient uniquement les colonnes suivantes: "id", "id_utilisateur", "id_produit" et les horodatages.
- Le modèle utilisateur "hasMany" (car un utilisateur peut stocker plusieurs produits).
- Le CartModel "appartient" à un utilisateur et CartModel "hasMany" Products.

Maintenant, pour calculer le total des produits, je peux simplement appeler: Auth::user()->cart()->count().

Ma question est la suivante: comment puis-je obtenir la somme () des prix (une colonne de produit) des produits dans le panier de cet utilisateur?
J'aimerais accomplir cela avec Eloquent et non en utilisant une requête (principalement parce que je pense que c'est beaucoup plus propre).

88
theAdmiral

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

La documentation est un peu légère pour certaines méthodes Collection, mais tous les agrégats du générateur de requêtes sont apparemment disponibles, à l'exception de avg(), accessible à l'adresse http://laravel.com/docs./requêtes # agrégats .

182
user1669496

ce n'est pas votre réponse, mais bien pour ceux qui viennent chercher ici une solution à un autre problème. Je voulais obtenir la somme d'une colonne de table liée sous condition. Dans ma base de données Deals contient de nombreuses activités pour lesquelles je souhaitais obtenir la somme du "montant_total" de la table des activités où activities.deal_id = deal.id et activities.status = étaient payées.

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

il revient

"paid_sum_count" => "320.00"

dans l’attribut Deals.

C'est maintenant la somme que je voulais obtenir pas le compte.

39
ahmad ali

J'ai essayé de faire quelque chose de similaire, ce qui m'a pris beaucoup de temps avant que je puisse comprendre la fonction collect (). Donc, vous pouvez avoir quelque chose comme ça:

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

Cela vous donnera la somme totale de tous les éléments.

10
Abdur Rahman Turawa