function (MorphTo $morphTo) { $morphTo->morphWith([ TaskLedger::class, TaskPerformance::class, TaskHygiene::class => ['workflow'], ]); }]) ->where('task_status', TaskStatus::Pending) ->where('end_at', '<', $datetime) ->lazyById() ->each(function ($task) use ($datetime) { try { DB::beginTransaction(); switch (Relation::getMorphedModel($task->taskable_type)) { case TaskLedger::class: if ($task->taskable->task_status === TaskLedgerStatus::Success) { $task->update([ 'task_status' => TaskStatus::Success, 'completed_at' => $datetime, ]); } else { $task->update([ 'task_status' => TaskStatus::Failed, ]); } break; case TaskPerformance::class: if ($task->taskable->task_status === TaskPerformanceStatus::Success) { $task->update([ 'task_status' => TaskStatus::Success, 'completed_at' => $datetime, ]); } else { $task->update([ 'task_status' => TaskStatus::Failed, ]); } break; case TaskHygiene::class: switch ($task->taskable->task_status) { case TaskHygieneStatus::Success: $task->update([ 'task_status' => TaskStatus::Success, 'completed_at' => $datetime, ]); break; case TaskHygieneStatus::Unpassed: case TaskHygieneStatus::Failed: $task->update([ 'task_status' => TaskStatus::Failed, ]); break; } break; } DB::commit(); } catch (Throwable $e) { DB::rollBack(); report($e); } }); } }