【问题标题】:Laravel Multiple Count in 1 Query and display it on my views using @foreach?Laravel Multiple Count in 1 Query 并使用@foreach 将其显示在我的视图中?
【发布时间】:2018-10-04 01:46:21
【问题描述】:

对不起,我是这个框架的新手,我计划改进我的代码,为了获取值的计数而声明大量变量很麻烦。帮我看看我的代码。

$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 as $broken) 在我的视图中调用它。由于这个原因,我的代码处理速度很慢,请帮助我。谢谢

【问题讨论】:

    标签: laravel-4 eloquent


    【解决方案1】:

    您可以使用带有条件聚合的单个查询:

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

    请注意,如果未对数组([1][2] 等)进行消毒,上述代码可能容易受到 SQL 注入攻击。

    此答案对应于以下原始 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>;
    

    【讨论】:

    • 谢谢您的回复,先生,那我该如何称呼这个?关于 foreach 语句
    • 一张一张?我以为你只要求一个查询?
    • 我将在我的视图中显示它,我是这个框架的新手。是否可以将我的观点称为 eliases?
    • 我真的不明白你想在这里做什么。也许编辑您的问题并说明实际问题。
    猜你喜欢
    • 2019-04-19
    • 1970-01-01
    • 2019-10-08
    • 2021-09-08
    • 2016-04-02
    • 2019-12-07
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多