laravel 13 尚未发布,当前无批量删除语法变更;正确写法为 db::table()->wherein()->delete() 或模型查询构建器 delete(),需注意 wherein 参数类型、分块处理及软删除逻辑。

Laravel 13 尚未发布(截至 2026 年 9 月,最新稳定版为 Laravel 11,Laravel 12 处于 RC 阶段),官方并未发布 Laravel 13,也无任何关于其批量删除语法变更的公告、RFC 或文档。目前所有主流 Laravel 版本(9/10/11/12)中,批量删除的核心语法和推荐实践保持高度一致,没有颠覆性改动。
所以你遇到的“语法变化”,大概率是以下情况之一:
- 项目误标版本(如实际是 Laravel 11,但配置或日志显示 13)
- 使用了第三方包(如
laravel-eloquent-scope或自定义全局作用域)覆盖了默认行为 - 启用了严格模式或升级了 PHP/PDO/MySQL 版本,触发了底层兼容性告警(例如
whereIn()参数超限、delete()返回值类型变化等) - 混淆了 Eloquent 模型删除与查询构建器删除的语义差异
✅ 正确且通用的批量删除写法(适用于 Laravel 9–12,同样适用于未来 Laravel 13):
1. 纯 ID 列表删除(最常用)
// ✅ 推荐:用 DB::table(),语义清晰、不走模型逻辑、性能可控
DB::table('users')->whereIn('id', $ids)->delete();
// ✅ 或用 Eloquent 查询构建器(效果相同,但注意软删除作用域是否生效)
User::whereIn('id', $ids)->delete(); // 软删除表会自动加 where deleted_at is null
2. 带条件的批量删除
// 删除指定状态 + 时间范围的订单
DB::table('orders')
->where('status', 'cancelled')
->where('created_at', 'subDays(30))
->delete();
3. 多态关联数据清理(如 comments 表)
DB::table('comments')
->where('commentable_type', 'App\Models\Post')
->where('commentable_id', $postId)
->delete();
⚠️ 需要特别注意的“易错点”(不是语法变化,而是常被忽略的细节):
-
whereIn()的$ids必须是纯数值数组,不能是字符串"1,2,3"或对象集合,否则报Incorrect integer value - MySQL 默认
max_allowed_packet限制IN子句参数数量(通常 ≤ 5000),超量需分块:collect($ids)->chunk(1000)->each(function ($chunk) { DB::table('logs')->whereIn('id', $chunk)->delete(); }); - 软删除模型调用
delete()会自动附加WHERE deleted_at IS NULL,若想强制物理删除,用:User::withTrashed()->whereIn('id', $ids)->forceDelete(); -
DB::table()->delete()返回影响行数(int),不是布尔值;别用if ($result)判定成功,应比对count($ids)和返回值做幂等校验
❌ 绝对不要写的写法(所有版本都低效且危险):
// ❌ 循环 delete() → N 条查询 + N 次事件 + N 次事务开销
foreach ($users as $user) {
$user->delete(); // 触发 deleting/deleted 事件,极慢
}
// ❌ 手拼 IN 字符串 → SQL 注入高危
DB::statement("DELETE FROM users WHERE id IN (" . implode(',', $ids) . ")");
不复杂但容易忽略











