Laravel Eloquent Сумма отношения столбца

46

Я работаю над приложением для покупок, и теперь я пришел к следующей проблеме.

Есть объект User, Product и Cart.
 - Таблица Корзина содержит только следующие столбцы: "id", "user_id", "product_id" и временные метки.
 - UserModel "hasMany" Carts (потому что пользователь может хранить несколько продуктов).
 - CartModel "принадлежит" пользователям и CartModel "hasMany".

Теперь, чтобы вычислить общие продукты, я могу просто позвонить: Auth::user()->cart()->count().

Мой вопрос: как я могу получить SUM() цен (столбец продукта) продуктов в корзине этим пользователем?
Я хотел бы сделать это с помощью Eloquent, а не с помощью запроса (главным образом потому, что я считаю, что он намного чище).

Теги:
eloquent
relation

3 ответа

97
Лучший ответ

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

Документация немного облегчает некоторые из методов Collection, но все агрегаторы построителей запросов, по-видимому, доступны помимо avg(), которые можно найти в http://laravel.com/docs/queries#aggregates.

  • 1
    Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными в случае изменения связанной страницы.
  • 0
    Это включено ...
Показать ещё 12 комментариев
4

Я пробовал делать что-то подобное, и это заняло у меня много времени, прежде чем я смог найти функцию collection(). Итак, вы можете иметь что-то таким образом:

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

Это даст вам общую сумму всех предметов.

  • 4
    имя функции на самом деле является collect()
  • 0
    вам, вероятно, лучше просто зацикливать массив. collect() используется для обогащения массива в объекте коллекции, но если у вас нет коллекции в первую очередь, может быть лучше просто использовать необработанный массив
1

это не ваш ответ, а для тех, кто пришел сюда, для поиска другой проблемы. Я хотел бы получить сумму столбца связанной таблицы условно. В моей базе данных сделок есть много видов деятельности Я хотел получить сумму "amount_total" из таблицы Activities, где activity.deal_id = deal.id и activities.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"

в атрибуте "Сделки".

Это теперь сумма, которую я хотел получить, а не счет.

  • 2
    Это лучшее во многих случаях, потому что вы можете сортировать по нему без необходимости получать все записи.
  • 5
    Это просто блестящее использование withCount!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню