getKeyName(); $queryModifier ??= static fn (Builder $builder) => $builder; $maxChunkSize = DB::getDriverName() === 'sqlite' ? 999 : 65_535; if (count($values) <= $maxChunkSize) { $queryModifier(static::query())->whereNotIn($field, $values)->delete(); return; } $allIds = static::query()->select($field)->get()->pluck($field)->all(); $deletableIds = array_diff($allIds, $values); if (count($deletableIds) < $maxChunkSize) { $queryModifier(static::query())->whereIn($field, $deletableIds)->delete(); return; } static::deleteByChunk($deletableIds, $maxChunkSize, $field); } public static function deleteByChunk(array $values, int $chunkSize = 65_535, ?string $field = null): void { $field ??= (new static())->getKeyName(); DB::transaction(static function () use ($values, $field, $chunkSize): void { foreach (array_chunk($values, $chunkSize) as $chunk) { static::query()->whereIn($field, $chunk)->delete(); } }); } }