Laravel — считая от третьего отношения

У меня есть следующий код:

        $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');
}

0

Решение

Ларавелла имеет совокупный метод который делает именно это.

Так же, как вы используете 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;

}
0

Другие решения

Вы можете использовать sum () с вашим красноречивым запросом в laravel. Проверьте в разделе #Aggregates здесь:

http://laravel.com/docs/4.2/queries

0

По вопросам рекламы [email protected]