Laravel Multiple Count в 1 запросе и отображать его на моих представлениях с помощью @foreach? - PullRequest
0 голосов
/ 04 октября 2018

Извините, я новичок в этой платформе, я планирую улучшить свой код, поэтому сложно объявить тонны переменных просто для того, чтобы получить количество значений.помогите мне, ребята, увидеть мой код.

$broken = LiipRepairMaintenanceItem::join('liip_psrm_components', 'liip_psrm_components.psrm_components_id', '=', 'liip_psrm_items.id')
    ->where('liip_psrm_items.psrm_items_id', '=', $psrm_maintenance->id)
    ->whereIn('liip_psrm_components.problem_code',  [1])
    ->count();

    $broken_negligence = LiipRepairMaintenanceItem::join('liip_psrm_components', 'liip_psrm_components.psrm_components_id', '=', 'liip_psrm_items.id')
    ->where('liip_psrm_items.psrm_items_id', '=', $psrm_maintenance->id)
    ->whereIn('liip_psrm_components.problem_code',  [2])
    ->count();

    $drop = LiipRepairMaintenanceItem::join('liip_psrm_components', 'liip_psrm_components.psrm_components_id', '=', 'liip_psrm_items.id')
    ->where('liip_psrm_items.psrm_items_id', '=', $psrm_maintenance->id)
    ->whereIn('liip_psrm_components.problem_code',  [3])
    ->count();

    $sliced_by_Forklift = LiipRepairMaintenanceItem::join('liip_psrm_components', 'liip_psrm_components.psrm_components_id', '=', 'liip_psrm_items.id')
    ->where('liip_psrm_items.psrm_items_id', '=', $psrm_maintenance->id)
    ->whereIn('liip_psrm_components.problem_code',  [4])
    ->count();


switch ($status) {
        case 'getApprove':
            // Title
            $title = Lang::get('liipPsrmMaintenance::repairMaintenance/title.repair_maintenance_approve');
            //Show the page
            return View::make('liipPsrmMaintenance::view.approve', compact('broken', 'broken_negligence', 'drop', 'sliced_by_Forklift '));
            break;

}

просмотров

<div class="col-md-4">
                    <form role="form">


                        <!-- Broken/Cracked -->
                        <div class="form-group">
                            <label>B -Broken/Cracked</label>
                            <p class="form-control-static">{{{ $broken }}}</p>
                        </div>
                        <!-- ./ Broken/Cracked -->

                        <!-- Broken/Cracked -->
                        <div class="form-group">
                            <label>B -Broken/Cracked due to negligence</label>
                            <p class="form-control-static">{{{ $broken_negligence }}}</p>
                        </div>
                        <!-- ./ Broken/Cracked -->

                        <!-- Dry rot -->
                        <div class="form-group">
                            <label>DR -Dry rot</label>
                            <p class="form-control-static">{{{ $sliced_by_Forklift }}}</p>
                        </div>
                        <!-- ./ Dry rot -->

                        <!-- dropped -->
                        <div class="form-group">
                            <label>D -dropped</label>
                            <p class="form-control-static">{{{ $drop }}}</p>
                        </div>
                        <!-- ./ dropped -->

                    </form>
                </div>

можно ли сжать его в 1 запрос для большей скорости обработки, тогда я буду вызывать его в моих представлениях, используя @foreach($ broken-> broken_negligence как $ broken).Я страдаю от медленной обработки кода из-за этого, помогите мне, ребята.Спасибо

1 Ответ

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

Вы можете использовать один запрос с условным агрегированием:

$result = LiipRepairMaintenanceItem::join('liip_psrm_components', 'liip_psrm_components.psrm_components_id', '=', 'liip_psrm_items.id')
    ->select(DB::raw("COUNT(CASE WHEN liip_psrm_components.problem_code IN (".[1]." THEN 1 END) AS broken" .
        "COUNT(CASE WHEN liip_psrm_components.problem_code IN (".[2]." THEN 1 END) AS broken_negligence" .
        "COUNT(CASE WHEN liip_psrm_components.problem_code IN (".[3]." THEN 1 END) AS drop" .
        "COUNT(CASE WHEN liip_psrm_components.problem_code IN (".[4]." THEN 1 END) AS sliced_by_Forklift"))
    ->where('liip_psrm_items.psrm_items_id', '=', $psrm_maintenance->id);

Обратите внимание, что приведенный выше код может быть уязвим для внедрения SQL, если массивы ([1], [2] и т. Д.)не стерилизован.

Этот ответ соответствует следующему необработанному запросу MySQL:

SELECT
    COUNT(CASE WHEN t2.problem_code IN [1] THEN 1 END) AS broken,
    COUNT(CASE WHEN t2.problem_code IN [2] THEN 1 END) AS broken_negligence,
    COUNT(CASE WHEN t2.problem_code IN [3] THEN 1 END) AS drop,
    COUNT(CASE WHEN t2.problem_code IN [4] THEN 1 END) AS sliced_by_Forklift
FROM liip_psrm_items t1
INNER JOIN liip_psrm_components t2
    ON t1.id = t2.psrm_components_id
WHERE
    t1.psrm_items_id = <some value>;
...