【问题标题】:Laravel limit result of multiple record table select based on if all records meet specific criteria基于所有记录是否满足特定条件的多记录表选择的Laravel限制结果
【发布时间】:2020-12-10 18:35:02
【问题描述】:

我有一个表,其中包含多个具有相同外键 (work_order_id) 的记录。这些记录有一个状态字段(Pending 或 Completed)。我只想返回那些 work_order_id 的所有记录都匹配状态 = 已完成的 work_order_id。如果有 5 条 work_order_id 为 95000 的记录,其中 1 条状态为 Pending,其余为 status = Completed,我不想在结果中返回 work_order_id 95000。

我目前在 PHP 中使用了一个根本没有效率的 foreach 循环。随着记录数的增加,我遇到了查询超时。

 $work_orders = DB::table('work_orders')
            ->select(
                'work_orders.*',
                'vehicles.vin',
                'work_orders.transportation_type as transport',
                'clients.name as client_name',
                'events.event_name as event_name'
            )
            ->where('status', '!=', 'Closed')
            ->leftJoin('vehicles', 'vehicles.id', '=', 'work_orders.gsm_vehicle_id')
            ->leftJoin('clients', 'clients.id', '=', 'work_orders.client_id')
            ->leftJoin('events', 'events.id', '=', 'work_orders.gsm_event_id')
            ->get();


        foreach ($work_orders as $wo) {
            $tasks = DB::table("work_order_tasks")
                ->where("work_order_id", $wo->id)
                ->where("status", "<>", "Completed")
                ->count();
            if ($tasks == 0) {
                $results[] = $wo;
            }
        } 

我最终想出了一个解决方案。我使用了两个查询。第一个获取 work_order_id 的列表。我将它传递给第二个查询的 where in 以获得我的结果。

$completedWO = DB::select(
            DB::raw("
            SELECT DISTINCT
                r.work_order_id
            FROM
                work_order_tasks AS r
            WHERE
                NOT EXISTS (
                SELECT
                    work_order_id
                FROM
                    work_order_tasks
                WHERE
                work_order_id = r.work_order_id
                AND STATUS = 'Pending')
                ORDER BY r.work_order_id ASC
            "));

            $output = array_map(function ($object) { return $object->work_order_id; }, $completedWO);
            $wo = "'" . implode("', '", $output) . "'";
           
        $results = DB::table('work_orders')
            ->select(
                'work_orders.*',
                'vehicles.vin',
                'work_orders.transportation_type as transport',
                'clients.name as client_name',
                'events.event_name as event_name'
            )
            ->leftJoin('vehicles', 'vehicles.id', '=', 'work_orders.gsm_vehicle_id')
            ->leftJoin('clients', 'clients.id', '=', 'work_orders.client_id')
            ->leftJoin('events', 'events.id', '=', 'work_orders.gsm_event_id')
            ->where('work_orders.status', '!=', 'Closed')
            ->whereRaw('work_orders.id IN ('. $wo . ')')
            ->orderBy('work_orders.id', 'ASC')
            ->get();

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    我不知道这是否可行,因为我没有你的数据库,但为什么不将表连接在一起并根据计数对相关记录进行分组。

    类似的东西。

    $work_orders = DB::table('work_orders')
                    ->select(
                       DB::raw('COUNT(work_order_tasks.work_order_id) count'),
                        'work_orders.*',
                        'vehicles.vin',
                        'work_orders.transportation_type as transport',
                        'clients.name as client_name',
                        'events.event_name as event_name'
                    )
                    ->havingRaw('count>0')
                    ->groupBy('work_orders.id')
                    ->where('status', '!=', 'Closed')
                    ->where("work_order_tasks.status", "<>", "Completed")
                    ->leftJoin('vehicles', 'vehicles.id', '=', 'work_orders.gsm_vehicle_id')
                    ->leftJoin('clients', 'clients.id', '=', 'work_orders.client_id')
                    ->leftJoin('events', 'events.id', '=', 'work_orders.gsm_event_id')
                    ->leftJoin('work_order_tasks', 'work_orders.id', '=','work_order_tasks.work_order_id')
                    ->get();
    

    【讨论】:

    • 这将返回与我正在寻找的相反的结果。我想将其限制为那些在 work_order_tasks 中没有状态 Pending 记录的记录。
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2017-07-15
    • 2015-02-15
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多