Приложение на Laravel 5.6.
Есть таблицы orders, products, order_products. В таблице order_products есть поля order_id, product_id, price, count. Вопрос: каким образом я могу получить список заказов (Orders) с их суммами через Eloquent?
Базовые отношения прописаны:
class Order extends Model
{
public function products() {
return $this->belongsToMany('App\Product', 'order_products')
->withPivot('count', 'price', 'amount');
}
}
class OrderProduct extends Model
{
public function product() {
return $this->belongsTo('App\Product');
}
public function order() {
return $this->belongsTo('App\Order');
}
}
Если реализовать ваш запрос на sql, то получится что-то вроде:
select * from orders join (
select order_id, sum(price) * count as sum from order_products group by order_id
) op on orders.id = op.order_id
Это можно реализовать с помощь Order::query() и join(), но это будет сильно влиять на производительность и, в случае, если вы захотите использовать пагинацию, то, для оптимизации, в подзапрос нужно будет вставить where order_id IN (order1, order2, .., orderN), перед этим выполнив ещё один запрос, получающий id заказов.
Это не очень оптимальный подход, вариантом будет добавление ещё одного поля total_sum в orders, в которое будет записываться сумма всего заказа при добавлении или удалении товаров.
$orders = Order::leftJoin('order_products', 'order_products.order_id', '=', 'orders.id')
->select('orders.*', DB::raw( 'sum( order_products.price * order_products.count) as `total`' ) )
->groupBy('orders.id')
->orderBy('total', 'DSC')
->get();
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости