我的猜测是使用以下语法:
MyModel::all()->delete();
但这没有用。我确定它非常简单,但是我搜索了有关该主题的文档但找不到!
MyModel::all()->delete()
不起作用的原因是因为 all()
实际上会触发查询并返回 Eloquent 对象的集合。
您可以使用 truncate 方法,这适用于 Laravel 4 和 5:
MyModel::truncate();
这会从表中删除所有行,而不记录单个行删除。
Laravel 5.2+ 解决方案。
Model::getQuery()->delete();
只需使用表名获取底层构建器并执行任何操作。没有比这更整洁的了。
Laravel 5.6 解决方案
\App\Model::query()->delete();
如果您禁用 foreign_key_checks
,您可以使用 Model::truncate()
(我假设您使用 MySQL)。
DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
我已经看到种子文件中使用了这两种方法。
// Uncomment the below to wipe the table clean before populating
DB::table('table_name')->truncate();
//or
DB::table('table_name')->delete();
即使您想设置外键也不能使用第一个。
无法截断外键约束中引用的表
所以使用第二个可能是个好主意。
delete
显然与 truncate
不同。
有一个间接的方法:
myModel:where('anyColumnName', 'like', '%%')->delete();
例子:
User:where('id', 'like' '%%')->delete();
Laravel 查询构建器信息:https://laravel.com/docs/5.4/queries
DELETE FROM users WHERE id LIKE '%%'
,从而删除所有内容。
whereIn
方法从我的模型中删除所有记录:$itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all();
ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
我想为那些通过 Google 访问该主题的人添加另一个选项。我需要完成此操作,但想保留 truncate()
重置的自动增量值。我也不想使用 DB::
任何东西,因为我想直接在模型对象之外进行操作。所以,我选择了这个:
Model::whereNotNull('id')->delete();
显然,该列必须实际存在,但在标准的、开箱即用的 Eloquent 模型中,id
列存在并且永远不会为空。我不知道这是否是最佳选择,但它适用于我的目的。
Model::delete();
将完成同样的事情。
Model::delete()
抛出异常 Non-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically
,至少在 Laravel 5.0 中是这样。
简单的解决方案:
Mymodel::query()->delete();
query()->forceDelete()
。
我无法使用 Model::truncate()
,因为它会出错:
SQLSTATE [42000]:语法错误或访问冲突:1701 无法截断外键约束中引用的表
不幸的是 Model::delete()
不起作用(至少在 Laravel 5.0 中):
假设 $this 来自不兼容的上下文,不应静态调用非静态方法 Illuminate\Database\Eloquent\Model::delete()
但这确实有效:
(new Model)->newQuery()->delete()
如果您设置了软删除,这将软删除所有行。要完全删除所有行,包括软删除的行,您可以更改为:
(new Model)->newQueryWithoutScopes()->forceDelete()
你也可以试试这个保留软删除的单行:
Model::whereRaw('1=1')->delete();
在 Laravel 3
中完成此操作的最佳方法似乎是使用 Fluent
接口截断表,如下所示
DB::query("TRUNCATE TABLE mytable");
truncate
的问题在于它意味着立即提交,因此如果在事务中使用它,风险是您发现表为空。最好的解决方案是使用 delete
MyModel::query()->delete();
与 Travis vignon 的回答类似,我需要来自 eloquent 模型的数据,如果条件正确,我需要删除或更新模型。我最终得到了查询返回的最小和最大字段(如果将另一个字段添加到满足我的选择条件的表中)以及原始选择条件,以通过一个原始 SQL 查询更新字段(如与集合中的每个对象一个雄辩的查询相反)。
我知道使用原始 SQL 违反了 laravel 美丽的代码理念,但它很难忍受可能数百个查询来代替一个。
在我的情况下 laravel 4.2 删除所有行,但不截断表
DB::table('your_table')->delete();
使用带有外键约束的 Lumen 5.5 的解决方案:
$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();
}
return response()->json(['error' => false]);
不定期副业成功案例分享
MyModel::all()->delete()
,请使用foreach (MyModel::all() as $e) { $e->delete() }