我的猜测是使用以下语法:
MyModel::all()->delete();
但那没用。我确信它非常简单,但我搜索了有关该主题的文档但找不到它!
答案 0 :(得分:210)
MyModel::all()->delete()
不起作用的原因是因为all()
实际触发查询并返回Eloquent对象的集合。
你可以使用truncate方法,这适用于Laravel 4和5:
MyModel::truncate();
删除表中的所有行而不记录单个行删除。
答案 1 :(得分:54)
Laravel 5.2 + 解决方案。
Model::getQuery()->delete();
只需使用表名抓取底层构建器并执行任何操作。 不能比那更整洁。
Laravel 5.6 解决方案
\App\Model::query()->delete();
答案 2 :(得分:50)
如果禁用Model::truncate()
,我可以使用foreign_key_checks
(我假设您使用的是MySQL)。
DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
答案 3 :(得分:27)
我已经看到这两种方法都在种子文件中使用过。
// Uncomment the below to wipe the table clean before populating
DB::table('table_name')->truncate();
//or
DB::table('table_name')->delete();
如果您想设置外键,即使您无法使用第一个。
无法截断外键约束中引用的表
所以使用第二个可能是个好主意。
答案 4 :(得分:12)
有一种间接的方式:
myModel:where('anyColumnName', 'like', '%%')->delete();
示例:
User:where('id', 'like' '%%')->delete();
Laravel查询构建器信息:https://laravel.com/docs/5.4/queries
答案 5 :(得分:8)
我想为通过Google访问此主题的人添加另一个选项。我需要完成此操作,但希望保留truncate()
重置的自动增量值。我也不想使用DB::
任何东西,因为我想直接从模型对象操作。所以,我接受了这个:
Model::whereNotNull('id')->delete();
显然该列必须实际存在,但在标准的,开箱即用的Eloquent模型中,id
列存在且永远不为空。我不知道这是否是最好的选择,但它适用于我的目的。
答案 6 :(得分:4)
在Laravel 3
中完成此操作的最佳方法似乎是使用Fluent
接口来截断表格,如下所示
DB::query("TRUNCATE TABLE mytable");
答案 7 :(得分:4)
我无法使用Model::truncate()
,因为它会出错:
SQLSTATE [42000]:语法错误或访问冲突:1701无法截断外键约束中引用的表
不幸的是Model::delete()
不起作用(至少在Laravel 5.0中):
非静态方法Illuminate \ Database \ Eloquent \ Model :: delete()不应该静态调用,假设$ this来自不兼容的上下文
但这确实有效:
(new Model)->newQuery()->delete()
如果你有软删除设置,那将软删除所有行。要完全删除所有行,包括软删除的行,您可以更改为:
(new Model)->newQueryWithoutScopes()->forceDelete()
答案 8 :(得分:3)
通过这样做,您还可以进一步利用Eloquent的功能;
MyModel::get()->each->delete();
答案 9 :(得分:1)
您还可以尝试使用此一线功能,同时保留软删除功能:
Model::whereRaw('1=1')->delete();
答案 10 :(得分:0)
与Travis vignon的回答类似,我需要来自雄辩模型的数据,如果条件正确,我需要删除或更新模型。我最终得到了我的查询返回的最小和最大字段(如果另一个字段被添加到符合我选择标准的表中)以及原始选择条件,则通过一个原始SQL查询更新字段(如反对集合中每个对象的一个雄辩查询。)
我知道使用原始SQL违反了laravels漂亮的代码哲学,但是很难用数百个查询代替一个查询。
答案 11 :(得分:0)
也可以进行foreach循环..
def __init__(self, type, reference, phone_number, user_id):
self.type = type
self.reference = reference
self.phone_number = phone_number
self.user_id = user_id
答案 12 :(得分:0)
使用外键约束与Lumen 5.5一起工作的解决方案:
void insertQueue(Queue *queue, void *data){
if (queue == NULL) {
printf("Heap not initialized.\n");
return;
}
if (data == NULL) {
printf("Memory for Data is not allocated.\n");
return;
}
Node * newNode = createQueueNode(data);
if (newNode == NULL) {
printf("Node not allocated.\n");
return;
}
printf("New node.\n");
// If the queue tree.
if (queue -> queue == NULL) {
queue -> queue = newNode;
}else{
Node * addHere = getNextInsertionPointer(queue->queue);
addHere = newNode;
//heapify(queue);
}
}
答案 13 :(得分:0)
简单的解决方案:
Mymodel::query()->delete();
答案 14 :(得分:0)
在我的情况下,laravel 4.2删除所有行,但不截断表
DB :: table('your_table')-> delete();