如何使用Eloquent删除表中的所有行?

时间:2013-03-18 18:41:49

标签: laravel laravel-4 eloquent

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

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

但那没用。我确信它非常简单,但我搜索了有关该主题的文档但找不到它!

15 个答案:

答案 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)

也可以进行循环..

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();