我的猜测是使用以下语法:

MyModel::all()->delete();

但这并没有起作用。我相信这是超级简单的,但我已经搜索了关于这个主题的文档,但找不到它!


当前回答

我在种子文件中看到过这两种方法。

// Uncomment the below to wipe the table clean before populating

DB::table('table_name')->truncate();

//or

DB::table('table_name')->delete();

即使你不能使用第一个,如果你想设置外键。

不能截断外键约束中引用的表

所以用第二个可能是个好主意。

其他回答

MyModel::all()->delete()不起作用的原因是all()实际上触发了查询并返回了Eloquent对象的集合。

你可以使用截断方法,这适用于Laravel 4和5:

MyModel::truncate();

这将从表中删除所有行,而不记录单个行删除。

在Laravel 3中完成此操作的最佳方法似乎是使用Fluent接口截断表,如下所示

DB::query("TRUNCATE TABLE mytable");

与Travis vignon的回答类似,我需要雄辩模型的数据,如果条件正确,我需要删除或更新模型。我最终得到了我的查询返回的字段的最小值和最大值(如果另一个字段添加到表中,将满足我的选择标准)以及原始的选择标准,以便通过一个原始SQL查询更新字段(而不是对集合中的每个对象进行一个有力的查询)。

我知道使用原始SQL违反了laravel美丽的代码哲学,但它很难忍受可能有数百个查询代替一个查询。

我在种子文件中看到过这两种方法。

// Uncomment the below to wipe the table clean before populating

DB::table('table_name')->truncate();

//or

DB::table('table_name')->delete();

即使你不能使用第一个,如果你想设置外键。

不能截断外键约束中引用的表

所以用第二个可能是个好主意。

我不能使用Model::truncate(),因为它会出错:

SQLSTATE[42000]:语法错误或访问违规:1701不能截断外键约束中引用的表

不幸的是Model::delete()不起作用(至少在Laravel 5.0中):

非静态方法Illuminate\Database\Eloquent\Model::delete()不应该被静态调用,假设$this来自不兼容的上下文中

但这确实有效:

(new Model)->newQuery()->delete()

这将会软删除所有行,如果你设置了软删除的话。要完全删除所有行,包括软删除的行,您可以更改为:

(new Model)->newQueryWithoutScopes()->forceDelete()