Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 如何使用Eloquent删除表中的所有行?_Laravel_Laravel 4_Eloquent_Foreach - Fatal编程技术网

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

Laravel 如何使用Eloquent删除表中的所有行?,laravel,laravel-4,eloquent,foreach,Laravel,Laravel 4,Eloquent,Foreach,我的猜测是使用以下语法: MyModel::all()->delete(); 但这并不奏效。我确信它非常简单,但我已经搜索了关于这个主题的文档,却找不到它 之所以MyModel::all()->delete()不起作用,是因为all()实际上触发了查询并返回了一组有说服力的对象 您可以使用truncate方法,这适用于Laravel 4和5: MyModel::truncate(); 这将删除表中的所有行,而不记录单个行的删除。在Laravel 3中完成此操作的最佳方法似乎是使用Flu

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

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

但这并不奏效。我确信它非常简单,但我已经搜索了关于这个主题的文档,却找不到它

之所以
MyModel::all()->delete()
不起作用,是因为
all()
实际上触发了查询并返回了一组有说服力的对象

您可以使用truncate方法,这适用于Laravel 4和5:

MyModel::truncate();

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

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();
如果要设置外键,即使不能使用第一个外键。

无法截断外键约束中引用的表


因此,使用第二个可能是个好主意。

如果禁用
外键检查(我假设您使用MySQL),则可以使用
Model::truncate()


我想为那些通过谷歌访问这个帖子的人添加另一个选项。我需要完成这项工作,但我想保留我的自动增量值,
truncate()
resets。我也不想使用
DB::
任何东西,因为我想直接在模型对象之外进行操作。所以,我选择了这个:

Model::whereNotNull('id')->delete();

显然,该列必须实际存在,但在标准的开箱即用的雄辩模型中,
id
列存在并且从不为空。我不知道这是否是最好的选择,但它符合我的目的。

与Travis vignon的回答类似,我需要雄辩模型的数据,如果条件正确,我需要删除或更新模型。最后,我得到了查询返回的最小和最大I'd字段(以防在表中添加了另一个符合我的选择条件的字段)以及原始选择条件,以便通过一个原始SQL查询(而不是集合中每个对象的一个雄辩查询)更新字段


我知道原始SQL的使用违反了laravels优美的代码理念,但很难接受数百个查询来代替一个查询。

有一种间接的方法:

myModel:where('anyColumnName', 'like', '%%')->delete();
例如:

User:where('id', 'like' '%%')->delete();

Laravel查询生成器信息:

我无法使用
Model::truncate()
,因为它会出错:

SQLSTATE[42000]:语法错误或访问冲突:1701无法截断外键约束中引用的表

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

假设$this来自不兼容的上下文,则不应静态调用非静态方法illumb\Database\elount\Model::delete()

但这确实有效:

(new Model)->newQuery()->delete()
如果设置了“软删除”,则将软删除所有行。要完全删除所有行(包括软删除的行),您可以更改为:

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

Laravel 5.2+解决方案

Model::getQuery()->delete();
只需使用表名抓取底层生成器,然后执行任何操作。 再整洁不过了

Laravel 5.6解决方案

\App\Model::query()->delete();
我也能做一个循环

$collection = Model::get();

foreach($collection as $c) {

$c->delete();

}

使用外键约束的Lumen 5.5的解决方案:

$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();

}
return response()->json(['error' => false]);

您可以尝试使用这一行程序,它还可以保留软删除:

Model::whereRaw('1=1')->delete();
简单解决方案:

 Mymodel::query()->delete();
在我的例子中,Laravel4.2删除所有行,但不截断表



DB::table('your_table')->delete()

我为我的问题添加了一个Laravel3解决方案,供未来读者参考。很好。如果其他人在2016年在这里搜索自己,这也适用于Laravel 5。注意:truncate()还会重置任何自动增量计数器(还请注意,您不能截断具有外键约束的表)。仅供参考:truncate不会触发删除事件。如果您真的想使用
MyModel::all()->delete()
,请使用
foreach(MyModel::all())作为$e){$e->delete()}
删除
显然与
截断
不同。@sudopeople指出两者的区别会很有帮助。我还可以将它添加到我的答案中。TRUNCATE不能用于事务中,因为它不受回滚的影响。在这种情况下,这可以通过(new MyModel)->newQuery()->delete()实现Schema::enableForeignKeyConstraints()<代码>模型::删除()
将完成同样的事情。不幸的是,
Model::delete()
抛出一个异常
非静态方法Illumb\Database\Eloquent\Model::delete()不应静态调用,至少在Laravel 5.0中是这样。@aschipfl实际上没有太多解释。代码从id为“%”的用户运行SQL
DELETE,该id匹配表中的所有行,从而删除了所有内容。这让我上路了。最后,我在另一个模型上执行了一个pull(),以获取我所需的ID数组,然后使用该数组使用
方法从我的模型中删除所有记录,其中
方法:
$itemsAllContentIDs=Item::where('user_ID',$userId)->pull('Item_content_ID')->all()
ItemsContent::其中('id',$itemsAllContentIDs)->delete()如果其他人不明白为什么会这样,模型类会通过_调用magic方法将方法转发给构建器。因为模型类本身有一个delete方法,所以调用model::delete()会在您真正需要Builder方法时调用model方法。因此,要显式获取生成器,可以使用getQuery()。如果需要,这也不会删除相关表。它将强制删除所有记录,而不管软删除是打开还是关闭Model::whereNotNull('id')->delete();--当软删除在技术上是“是”时,将执行软删除…但我认为这似乎有点不必要,因为有更好的单查询选项。@Pete我知道。。其他人已经给出了答案。。。我在试着回答
 Mymodel::query()->delete();