with('tasks')->whereHas('tasks', function ($query) { $query->where('updated_at', '>', now()->subHours(2)); }) ->cursor() ->each(function ($project) { $project->current_hours = $this->calculateDuration($project); $project->save(); }); } else { //multiDB environment, need to foreach (MultiDB::$dbs as $db) { MultiDB::setDB($db); Project::query()->with('tasks')->whereHas('tasks', function ($query) { $query->where('updated_at', '>', now()->subHours(2)); }) ->cursor() ->each(function ($project) { $project->current_hours = $this->calculateDuration($project); $project->save(); }); } } } private function calculateDuration($project): int { $duration = 0; $project->tasks->each(function ($task) use (&$duration) { if(is_iterable(json_decode($task->time_log))) { foreach(json_decode($task->time_log) as $log) { $start_time = $log[0]; $end_time = $log[1] == 0 ? time() : $log[1]; $duration += $end_time - $start_time; } } }); return round(($duration / 60 / 60), 0); } }