我的猜测是使用以下语法:
MyModel::all()->delete();
但这不起作用。我相信这是超级简单的,但我已经搜索了关于这个主题的文档,但找不到它!
MyModel::all()->delete()不起作用的原因是因为all()实际上触发了查询并返回了一个Eloquent对象的集合。
MyModel::all()->delete()
all()
您可以使用Truncate方法,这适用于Laravel 4和5:
MyModel::truncate();
删除表中的所有行,而不记录单个行的删除。
在Laravel 3中完成此操作的最佳方式似乎是使用Fluent接口来截断该表,如下所示
Laravel 3
Fluent
DB::query("TRUNCATE TABLE mytable");
我见过这两种方法在种子文件中使用。
// Uncomment the below to wipe the table clean before populating DB::table('table_name')->truncate(); //or DB::table('table_name')->delete();
即使要设置外键时不能使用第一个。
无法截断外键约束中引用的表
所以用第二个可能是个好主意。
如果禁用foreign_key_checks(我假设您使用MySQL),则可以使用Model::truncate()。
foreign_key_checks
Model::truncate()
DB::statement("SET foreign_key_checks=0"); Model::truncate(); DB::statement("SET foreign_key_checks=1");
我想为那些通过谷歌进入这个主题的人添加另一个选项。我需要完成此操作,但希望保留truncate()重置的自动增量值。我也不想使用DB::任何东西,因为我想直接操作模型对象。所以,我选择了这个:
truncate()
DB::
Model::whereNotNull('id')->delete();
显然,列必须实际存在,但是在标准的、现成的Eloquent模型中,id列存在并且永远不会为空。我不知道这是不是最好的选择,但它符合我的目的。
id
与Travis Vignon的回答类似,我需要来自Eloquent模型的数据,如果条件正确,我需要删除或更新模型。我最终获得了查询返回的最小值和最大值字段(以防另一个字段被添加到表中以满足我的选择标准)以及原始选择标准,以通过一个原始SQL查询(而不是集合中每个对象一个有说服力的查询)来更新字段。
我知道使用原始SQL违反了Laravels的美丽代码哲学,但它很难接受可能有数百个查询而不是一个。
有一种间接的方法:
myModel:where('anyColumnName', 'like', '%%')->delete();
示例:
User:where('id', 'like' '%%')->delete();
Laravel查询生成器信息:https://laravel.com/docs/5.4/queries
我无法使用Model::truncate(),因为它会出错:
SQLSTATE[42000]:语法错误或访问冲突:1701无法截断在外键约束中引用的表
不幸的是,Model::delete()不起作用(至少在Laravel 5.0中):
Model::delete()
非静态方法Illuminate\Database\Eloquent\Model:delete()不应静态调用,假设$this来自不兼容的上下文
但这确实有效:
(new Model)->newQuery()->delete()
如果您设置了软删除,这将软删除所有行。要完全删除所有行(包括软删除的行),您可以更改为:
(new Model)->newQueryWithoutScopes()->forceDelete()
Laravel 5.2+溶液。
Model::getQuery()->delete();
只需获取具有表名的底层构建器,然后执行任何操作。 没有比这更整洁的了。
拉雷维尔5.6溶液
\App\Model::query()->delete();
您可以尝试这一行程序,它也保留了软删除:
Model::whereRaw('1=1')->delete();
简单的解决方案:
Mymodel::query()->delete();
在我的例子中,Laravel 4.2删除了所有行,但没有截断表
db:table('您_表')-amp;gt;delete();
truncate
的问题在于它暗示了立即提交, 因此,如果在事务中使用它,风险是您会发现表是空的。 最好的解决方案是使用delete
delete
MyModel::query()->delete();
在公文行中:
php artisan tinker
然后
Post::truncate();