Многократный счет Laravel в 1 запросе - PullRequest
0 голосов
/ 26 октября 2018

Я новичок в этой платформе, я не знаю, как оптимизировать ее, используя db :: raw count и aliases, и отобразить ее в моем blade.php, используя @ foreach

я пытаюсь оптимизировать свой код, мои цели - подсчитать pallet_conditions и сохранить его в моих псевдонимах, я не хочу считать его один за другим, как то, что я делал с этим кодом

это мой код не оптимизировать:

//computing the total rapairable
$repairable_total = DB::table('liip_psrm_items')
->where('psrm_items_id', '=' , $psrm_maintenance->id)
->where('pallet_condition', '=', 1)
->count();
//REPAIRABLE

//computing the total good pallets
$good_total = DB::table('liip_psrm_items')
->where('psrm_items_id', '=' , $psrm_maintenance->id)
->where('pallet_condition', '=', 0)
->count();
//GOOD

это код, который я хотел выучить. просто чтобы свести к минимуму и использовать псевдонимы

$result = DB::table('liip_psrm_items')
->select(DB::raw('COUNT(liip_psrm_items.pallet_condition = 0 ) AS condition_1',
                 'COUNT(liip_psrm_items.pallet_condition = 1 ) AS condition_2'))                      
                ->where('psrm_items_id', '=' , $psrm_maintenance->id)
                ->get();

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Нельзя использовать один запрос для двух разных результатов, что имеет совершенно противоположные условия.

Случай 1. Вы пытаетесь подсчитать элементы, для которых pallet_condition = 1;

Случай 2Вы пытаетесь посчитать элементы, для которых pallet_condition = 0;

Теперь вы хотите объединить эти два случая в один запрос, что невозможно ...

Итак, для этих двух случаевВы должны использовать либо отдельные запросы (что вы уже сделали)

, либо вы можете использовать один запрос, чтобы получить все элементы, а затем использовать PHP для их разделения.

Как:

$total_items = DB::table('liip_psrm_items')
   ->where('psrm_items_id', '=' , $psrm_maintenance->id)
   ->get();

$repairable_count = count(array_filter($total_items, function($item){
   return (bool)$item->pallet_condition;
}));

$good_count = count(array_filter($total_items, function($item){
   return !(bool)$item->pallet_condition; //just inverse of the above condition
}));

Надеюсь, это поможет.

0 голосов
/ 26 октября 2018

Попробуйте передать закрытие следующим образом:

$results = DB::table('liip_psrm_items')
->where('psrm_items_id', '=' , $psrm_maintenance->id)
->where(function($query){
   $query->where('pallet_condition', 1)
      ->orWhere('pallet_condition', 0);
})->count();
...