Laravel 中的 destroy() 和 delete() 方法有啥区别?

Posted

技术标签:

【中文标题】Laravel 中的 destroy() 和 delete() 方法有啥区别?【英文标题】:What is the difference between destroy() and delete() methods in Laravel?Laravel 中的 destroy() 和 delete() 方法有什么区别? 【发布时间】:2014-05-02 23:10:11 【问题描述】:

我在使用 Laravel 4 时遇到了一个小问题。我想在记录上使用 delete() 方法,但由于某种原因,它实际上并没有删除记录。 destroy() 确实如此,所以我的代码很好。另外,如果我将Teetime::where('date', '=', $formattedDate)->count() 传递给我的视图,我会得到一个正确的。有什么问题?

        if($action=="delete") 
            $teetime = Teetime::where('date', '=', $formattedDate)->firstOrFail();
            // for some reason $teetime->delete() doesn't work
            Teetime::destroy($teetime->id);
        

【问题讨论】:

对于 Laravel 的调制解调器版本,接受的答案是不正确的。继续滚动…… 【参考方案1】: destroy 是直接删除实体(通过对象或模型)的正确方法。

例子:

$teetime = Teetime::where('date', '=', $formattedDate)->firstOrFail();
$teetime->destroy();
delete 只能在查询生成器中调用

例子:

$teetime = Teetime::where('date', '=', $formattedDate)->delete();

来自文档:

按键删除现有模型

User::destroy(1);

User::destroy(array(1, 2, 3));

User::destroy(1, 2, 3);

当然,您也可以对一组模型运行删除查询:

$affectedRows = User::where('votes', '>', 100)->delete();

更多信息:http://laravel.com/docs/eloquent

【讨论】:

谢谢,但为什么文档还提供了这个例子:$user = User::find(1); $user->delete();?我在代码的其他地方使用了delete(),它运行良好。 我已经更新了我的答案,请检查一下:)它解释得很详细。 哦,我明白了。我认为是 firstOrFail() 让我退出了查询生成器。 是的,因为它返回一个对象(模型)。 这个答案怎么样?这个答案是错误的。 66 票?你误导了很多人。 Destroy 也调用模型方法 delete()。而且你几乎不应该在查询上调用 delete,因为它不会触发删除事件。【参考方案2】:

接受的答案在 2014 年可能是正确的,我不确定。现在肯定不正确了。

delete() 方法是针对模型类的实例调用的。使用原始问题的代码:

$teetime = Teetime::where('date', '=', $formattedDate)->firstOrFail();
// $teetime is a model instance
$teetime->delete();

destroy() 方法是模型类的静态方法。它接受一个或多个主键:

$teetime_ids = Teetime::where('date', '=', $formattedDate)->pluck('id');
// $teetime_ids is a collection of 1 or more primary keys
Teetime::destroy($teetime_ids);

来自the documentation:

删除模型

要删除模型,您可以在模型实例上调用 delete 方法:

use App\Models\Flight;
$flight = Flight::find(1);
$flight->delete();

按主键删除现有模型

在上面的示例中,我们在调用delete 方法之前从数据库中检索模型。但是,如果您知道模型的主键,则可以通过调用destroy 方法删除模型而无需显式检索它。除了接受单个主键之外,destroy 方法还将接受多个主键、主键数组或主键集合:

Flight::destroy(1);
Flight::destroy(1, 2, 3);
Flight::destroy([1, 2, 3]);
Flight::destroy(collect([1, 2, 3]));

还有一个delete() 查询构建器方法允许您直接从数据库表中删除记录。使用这种方法有一些重要的注意事项,重要的是要理解 Eloquent 实现了自己的查询构建器类,就像它自己的集合类一样。

当针对an Eloquent query builder 调用时,会保留某些行为,例如支持软删除。但是,Eloquent 事件 deletingdeleted 不会被触发,因为模型永远不会被创建。

delete() 也可以调用 base query builder class,它根本不了解 Eloquent。

比较生成的查询,假设Teetime 导入了SoftDeletes trait:

Teetime::where('date', '=', $formattedDate)->delete();
// UPDATE teetimes SET deleted_at = NOW(), updated_at = NOW() WHERE `date` = ?
DB::table('teetimes')->where('date', '=', $formattedDate)->delete();
// DELETE FROM teetimes WHERE `date` = ?

【讨论】:

恕我直言,添加 forceDelete 以及如何正确删除带有事件的多个模型,例如->each(function($element)$element->delete() Model::destroy() 会触发事件,因此您可以向它传递一个 id 数组。 (也可以查看高阶代理——不需要匿名函数。$collection->each->delete()

以上是关于Laravel 中的 destroy() 和 delete() 方法有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

laravel中delete()方法和destroy()方法的区别

如何在 Destroy 函数中删除具有多个参数的数据 - Laravel

Laravel 使用 destroy 方法删除条目

Laravel 缺少 [Route: destroy] 所需的参数。

Laravel 8 de迁移过程中的外国错误[重复]

没有 id 的 Laravel 资源路由销毁(DELETE)