Ларавель Красномовна сума стовпця відношення


111

Я працював над додатком Shoppingcart, і тепер я прийшов до наступного випуску ..

Є об'єкт "Користувач", "Продукт" та "Кошик".
- Таблиця Кошика містить лише такі стовпці: "id", "user_id", "product_id" та часові позначки.
- UserModel "hasMany" Візки (оскільки користувач може зберігати кілька продуктів).
- CartModel "належить" Користувачеві, а CartModel "маєMany" Продукти.

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

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

Відповіді:


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

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


вау, дякую за цю швидку відповідь. Зараз це просто говорить, що немає цінової колонки. Схоже, красномовне зовсім не дивиться на цю таблицю продуктів ....
Адмірал

3
Насправді це має сенс, ви повинні додати таблицю продуктів до відносин, вибачте. Спробуйте $sum = Auth::user()->cart()->products()->sum('price');або будь-яка стовпчик цін на таблиці продуктів.
користувач1669496

1
Це працювало для мене! Я перестав користуватися візками. І Користувач, і продукт тепер мають метод lastToMany (). Тепер я можу використовувати ціну: {{Auth :: user () -> products-> sum ('price')}} Thanx, Ця справа вирішена.
Адмірал

9
Тут щось не зовсім правильно - ваше посилання стосується застосування агрегативних функцій до запитів бази даних, але products->sumозначає, що це сума викликів на об'єкт колекції, а не на об'єкт builder, що повертається продуктами (). Варто уточнити, кого саме тут ви маєте на увазі, і в ідеалі надати посилання, щоб пояснити обидва.
Benubird

1
@ user3253002, використовуючи зв'язок без дужок, ...->products->...буде запитувати базу даних, щоб отримати всі пов'язані з поточною моделлю продукти, а потім працювати з цією колекцією пам'яті. Використання ...->products()->...просто модифікує запит, що будується, не виконуючи його, поки щось ->sum()не називається. Останній може бути більш ефективним, оскільки дозволяє уникнути передачі непотрібної інформації з бази даних у пам'ять.
Зіген

62

це не ваша відповідь, але для тих, хто приходить сюди, шукаючи рішення для іншої проблеми. Я хотів умовно отримати суму стовпця пов’язаної таблиці. У моїй базі даних Пропозиції є багато заходів, які я хотів отримати суму "кількість_тоталів" з таблиці "Діяльність", де діяльність.deal_id = deal.id і activities.status = оплачено, тому я це зробив.

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

Це тепер сума, яку я хотів отримати, не вважаю.


4
Це найкраще у багатьох випадках, оскільки ви можете сортувати за ним, не маючи необхідності отримувати всі записи.
Сабріна Леггетт

15

Я спробував зробити щось подібне, що зайняло у мене багато часу, перш ніж я міг зрозуміти функцію збирання (). Тож у вас може бути щось таке:

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

Це дасть вам загальну суму всіх предметів.


4
назва функції насправдіcollect()
Леонардо Біл

вам, мабуть, краще просто зациклювати масив. collect()використовується для збагачення масиву об’єктом колекції, але якщо у вас немає колекції в першу чергу, можливо, буде краще просто використати необроблений масив
Полум'я

0

Також використовує конструктор запитів

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

Отримати підсумок всіх значень ставки всередині таблиць.

Отримати підсумок продуктів користувача.

DB::table("users")->get()->sum("products")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.