where('notified', false) ->whereBetween('expiration', [Carbon::now(), Carbon::now()->addDay()]) ->chunkById(100, function ($invites) { foreach ($invites as $invite) { Mail::to($invite->requestor_email) ->send(new InviteExpiringSoon($invite)); $invite->notified = true; $invite->save(); } }); // 2. Delete invites that have actually expired Invitation::where('status', 'pending') ->where('expiration', '<', Carbon::now()) ->chunkById(100, function ($invites) { foreach ($invites as $invite) { $invite->delete(); } }); } }