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 事件 deleting
和 deleted
不会被触发,因为模型永远不会被创建。
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