leftJoinSub( DB::table('task_history') ->select('id', DB::raw('MAX(created_at) as created_at'), 'output', 'status', 'task_id') ->groupBy('id') ->groupBy('output') ->groupBy('status') ->groupBy('task_id') ->groupBy('created_at') , 'task_history', function($join) { $join ->on('task_history.task_id', '=', 'tasks.id') ; }) ->select( 'tasks.id', 'tasks.host', 'tasks.status', 'tasks.type', 'tasks.params', 'tasks.frequency', 'tasks.created_at', 'tasks.executed_at', 'tasks.active', 'tasks.group_id', 'task_history.output', 'groups.name as group_name') ->get() ; foreach ($query as $t) { if (is_null($t->group_id)) { $group_id = $t->id; $group_name = 'ungrouped'; } else { $group_id = $t->group_id; $group_name = $t->group_name; } if (empty($tasks[$group_id])) { $tasks[$group_id] = [ 'id' => $group_id, 'name' => $group_name, 'tasks' => null ]; } $tasks[$group_id]['tasks'][$t->id] = $t; } return response()->json($tasks); } public function getTaskDetails($id) { $task = Task::with(['group', 'history']) ->find($id) ; if (! is_null($task)) { $limit = 100; return response()->json(array_merge($task->toArray(), [ $task, 'id' => $task->id, 'host' => $task->host, 'status' => $task->status, 'type' => $task->type, 'history' => $task->history()->limit($limit)->orderBy('created_at', 'DESC')->get(), 'group' => $task->group, 'limit' => $limit ])); } } public function toggleTaskStatus(Request $request, $id) { $active = $request->input('active', null); if (is_null($active)) { throw new ApiException('Invalid parameters'); } $active = intval($active); $task = Task::findOrFail($id); $task->active = $active; if ($task->save()) { return $this->getTaskDetails($id); } else { throw new ApiException('Cannot disable this task'); } } } class ApiException extends Exception {}