when(! is_null($user), function (Builder $builder) use ($user) { $builder->where('user_id', $user->id); })->whereIn($field, $keys); DB::transaction(function () use ($model, $keys, &$count) { /** @var Image $image */ foreach ($model->cursor() as $image) { // 相册图片数量更新 $image->album?->decrement('image_num'); // fork:图片删了,它与标签的关联行也要一并清掉。 // 迁移注释声明「关联行由应用代码显式删除」,这里就是那条规则(SQLite 未启用 // 外键级联,不显式删就会留下指向已删图片的残留行,无声累积)。 $image->tags()->detach(); // 更新相册图片数量 $image->delete(); // 更新数量 if ($image->user) { $image->user->image_num = $image->user->images()->count(); $image->user->save(); } $count++; } }); return $count; } }