У меня есть следующий код:
$main = Main::with(['clients', 'events.orderitems' => function($query) {
$query->whereIn('order_id', function($query) {
$query->select('id')->from('orders')->where('orderPaid', 1)->orWhere('orderStatus', 3);
});
}])->where('id', $id)->first();
foreach($main->events as $dates) {
$all_paid = 0;
$all_pending = 0;
foreach($dates->orderitems as $item) {
if($item->orderPaid == 1) {
$all_paid = $all_paid + $item->quantity;
}
}
$dates->orderscount = $all_paid;
foreach($dates->orderitems as $item) {
if($item->orderStatus == 3) {
$all_pending = $all_pending + $item->quantity;
}
}
$dates->pendingcount = $all_pending;
}
Может быть, есть MYSQL способ подсчета ордеров PAID и ордеров с помощью orderStatus == 3 в SQL? Я думаю, как я это делаю, это очень грязно и не очень хорошо для выступления.
Таким образом, у «Main» есть n-события, которые имеют n-orderItems.
Мне нужно попасть на «Главное» событие, все события со всеми оплаченными и orderStatus == 3 предмета. Как я могу это сделать?
ОБНОВЛЕНИЕ — РЕШЕНИЕ:
foreach($main->events as $dates) {
$dates->orderscount = OrderItems::where('events_id',$dates->id)->whereHas('orders', function($q) {
$q->where('orderPaid', 1);
})->sum('quantity');
$dates->pendingcount = OrderItems::where('events_id',$dates->id)->whereHas('orders', function($q) {
$q->where('orderStatus', 3);
})->sum('quantity');
}
Ларавелла имеет совокупный метод который делает именно это.
Так же, как вы используете first
чтобы получить только первый результат запроса, как в:
)->where('id', $id)->first();
чтобы получить количество, которое вы могли бы использовать count()
DB::table('orders')->where('orderPaid', 1)->orWhere('orderStatus', 3)->count();
Если вам нужно sum()
продуктов, а не count
как в вашем заголовке, вы можете использовать для вашего конкретного примера:
$total_quantity = DB::table('orders')->where('orderPaid', 1)->orWhere('orderStatus', 3)->sum('quantity');
Как и в вашем примере, чтобы получить оба значения, вы изменили бы себя foreach
быть чем-то похожим на:
foreach($main->events as $dates) {
$all_paid = DB::table('orders')->where('order_id',$dates->id)->where('orderPaid', 1)->count();
$all_pending = DB::table('orders')->where('order_id',$dates->id)->where('orderStatus', 3)->count();
$dates->orderscount = $all_paid;
$dates->pendingcount = $all_pending;
}
Вы можете использовать sum () с вашим красноречивым запросом в laravel. Проверьте в разделе #Aggregates здесь: