Laravel中destroy()和delete()方法有什么区别?

36 php laravel eloquent laravel-4

我在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);
        }
Run Code Online (Sandbox Code Playgroud)

pho*_*ops 58

  • destroy 是直接删除实体的正确方法(通过对象或模型).

例:

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

例:

$teetime = Teetime::where('date', '=', $formattedDate)->delete();
Run Code Online (Sandbox Code Playgroud)

来自文档:

按键删除现有模型

User::destroy(1);

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

User::destroy(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

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

$affectedRows = User::where('votes', '>', 100)->delete();
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,但为什么文档也提供了这个例子:`$ user = User :: find(1); $用户>删除();`?我在我的代码中的其他地方使用了`delete()`它一直工作正常. (5认同)
  • 这个答案怎么了?这个答案是错误的。66 票赞成?你误导了很多人。Destroy 也会调用模型方法delete()。而且您几乎永远不应该在查询上调用删除,因为它不会触发删除事件。 (3认同)

mik*_*n32 6

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

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

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

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

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

文档中:

删除模型

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

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

通过主键删除现有模型

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

use App\Models\Flight;
$flight = Flight::find(1);
$flight->delete();
Run Code Online (Sandbox Code Playgroud)

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

当针对Eloquent 查询构建器调用时,会保留某些行为,例如对软删除的支持。但是,Eloquent 事件deletingdeleted不会被触发,因为模型从未创建。

delete()也可以针对基本查询构建器类进行调用,该类根本不了解 Eloquent。

比较生成的查询,假设Teetime导入SoftDeletes特征:

Flight::destroy(1);
Flight::destroy(1, 2, 3);
Flight::destroy([1, 2, 3]);
Flight::destroy(collect([1, 2, 3]));
Run Code Online (Sandbox Code Playgroud)
Teetime::where('date', '=', $formattedDate)->delete();
// UPDATE teetimes SET deleted_at = NOW(), updated_at = NOW() WHERE `date` = ?
Run Code Online (Sandbox Code Playgroud)


Mai*_*rey 6

2022 年状况

我想知道有多少种解释。这种差异实际上很容易解释。

您有两种删除实体的方法:

  1. $model->delete()
  2. Model::destroy($model->id)

删除()

第一个选项直接指模型。这意味着您必须已经拥有它。例如,对于 RouteModelBinding 就是这种情况,您可以直接在控制器中删除实体。

public function destroy(SomeModel $model)
{
  return $model->delete();
}
Run Code Online (Sandbox Code Playgroud)

这里的返回值delete()是一个布尔值

破坏()

第二个选项不预设实体。您只需要型号。然后将所需实体的 id 作为参数传递。

public function destroy($id)
{
  return SomeModel::destroy($id);
}
Run Code Online (Sandbox Code Playgroud)

这里的返回值destroy()是一个整数。该数字告诉您有多少实体被删除。在该示例中,逻辑上它仅为 1。