![](/img/trans.png)
[英]Laravel PHP 8 blade -> getting a list of all parent table records, list them in a select element and selecting the record->name based on the foreignID
[英]Laravel limit result of multiple record table select based on if all records meet specific criteria
我有一個表,其中有多個記錄具有相同的外鍵 (work_order_id)。 這些記錄有一個狀態字段(待處理或已完成)。 我只想返回那些 work_order_id,其中該 work_order_id 的所有記錄都匹配狀態 = 已完成。 如果有 5 條記錄的 work_order_id 為 95000,其中 1 條的狀態為 Pending,而 rest 的狀態為 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 中以獲取結果。
$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();
我不知道這是否可行,因為我沒有您的數據庫,但為什么不將表連接在一起並根據計數對相關記錄進行分組。
就像是。
$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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.