Множественный счет laravel в 1 запросе

Я новичок в этой платформе, я не знаю, как ее оптимизировать с помощью db :: raw count и псевдонимов и отображать на моем 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();

Мне нравится ваш код Laravel. Каков ваш настоящий вопрос?

Tim Biegeleisen 26.10.2018 07:41
0
1
4 328
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Попробуйте пройти закрытие так:

$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();

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

Случай 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
}));

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

спасибо за предложение @jaskaran оценить его. ответ выше, Джонджи, реши мою проблему

BlackLeaf 29.10.2018 03:54

Можно сначала group by, потом получить count

Нравиться :

DB::table('liip_psrm_items')
  ->groupBy('pallet_condition')
  ->select('pallet_condition', DB::raw('count(*) as total'))
  ->get();

Для подсчета при нескольких условиях я использовал этот подход

 $lastMonthInvoices = Invoice::select(DB::raw("(COUNT(*)) as count"), DB::raw('SUM(total) as total'),'status')
        ->whereDate('created_at', '>', Carbon::now()->subMonth())
        ->groupBy('status')
        ->get();

Я получил результат с помощью groupBy Status и в каждой группе общее количество записей как количество, а также их сумма как общее

sample of one group

enter image description here

эти два снимка относятся к одному результату запроса

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