Суммарная цена отношения "один ко многим" (laravel)

У меня проблема с отношениями "один ко многим"! Итак, я пытаюсь суммировать цены на продукты, вот что я имею в виду:

Модель: Product.php

/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function orders(){
    return $this->hasMany(Order::class);
}

Модель: Orders.php

/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function product(){
    return $this->belongsTo(Product::class);
}

Итак, я хочу сделать что-то вроде этого: $ var-> product-> price-> sum ();

Моя база данных, если это необходимо:

Заказы: id product_id|user_id| |-|----------|-------| |1|1 |1 | | | | |

И в продуктах всего 4 столбца: id,name,price,description

Я имею в виду, что:

 products:

  id\1

  name\productname

  price \1.00USD

  id\2

  name\productname2

  price \1.00USD

Он должен вернуть сумму всего продукта, поэтому он должен вернуть 2,00 доллара США.

@Jonas Staudenmeir

У вас только один товар в заказе? В противном случае вам может потребоваться связь many to many с промежуточной таблицей. Док

iamab.in 13.07.2018 16:07

Да, у меня только один товар в заказе

Lubomir Stankov 13.07.2018 16:11

Что именно вы хотите подвести? Что такое $var?

Jonas Staudenmeir 13.07.2018 16:14

Если у вас только один продукт, зачем использовать sum? Вы можете попробовать $order->product->price;. Если у вас в заказе есть поле quantity, вы можете умножить цену на него.

iamab.in 13.07.2018 16:15

хм .. Не могли бы вы мне объяснить, как это будет происходить со многими и многими отношениями?

Lubomir Stankov 13.07.2018 16:15

$var здесь единый заказ?

apokryfos 13.07.2018 16:21

@apokryfos я просто привожу пример с $ var я хочу сделать всю цену пожертвования с заказами пользователей я просто хочу получить все продукты по идентификатору и суммировать их цены

Lubomir Stankov 13.07.2018 16:22

Вы имеете в виду что-то вроде $user->priceSum?

Jonas Staudenmeir 13.07.2018 16:41

теперь я имею в виду $ total-> priceSum

Lubomir Stankov 13.07.2018 16:42

Что такое $total?

Jonas Staudenmeir 13.07.2018 17:17

Послушайте, ребята, я хочу делать ежемесячный оборот, мне нужен только product_id и сумма всех цен на продукты, вы понимаете, что я хочу делать?

Lubomir Stankov 13.07.2018 17:32

$ total - это всего лишь пример того, что я хочу ..

Lubomir Stankov 13.07.2018 17:33

Пожалуйста, опубликуйте образцы данных и ожидаемый результат.

Jonas Staudenmeir 13.07.2018 17:49

В вашем примере похоже, что вам нужна сумма всех продуктов. Как это связано с заказами?

Jonas Staudenmeir 13.07.2018 18:06

По id, заказам: id,product_id

Lubomir Stankov 13.07.2018 18:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
15
1 935
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

попробуйте этот QueryBuilder Query:

 DB::table('orders')
    ->leftJoin('products','orders.product_id','=','products.id')
    ->where('orders.user_id',Auth::user()->id)
    ->select('orders.*','products.*',DB::raw("SUM(products.price) as order_total"))
    ->groupBy('orders.product_id')
    ->get();

Я найду решение! Так что я делаю это

Я использую текущие отношения, как befor, и делаю эту функцию в своем order.php модель

public function getTotalPrice() {

$orders = self::with('product')->get();

$total = 0;

foreach($orders as $order) {
 $total += $order->product->price;
} 

return $total;
}

Теперь я могу использовать свою функцию, например obj, и называть ее $var->getTotalPrice();.

Немного короче: $total = $orders->pluck('product')->sum('price');

Jonas Staudenmeir 13.07.2018 19:39
Ответ принят как подходящий

Использование красноречивых моделей без DB

Product::with(['orders' => function($query){
   $query->sum('price');
}])->get();

В Laravel 6+ мы можем использовать вот так, очень просто

$total = $order->product->sum('price');

Другие вопросы по теме