Laravel 中的 destroy() 和 delete() 方法有什么区别?按键删除现有模型

2022-08-30 11:31:34

我在 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);
        }

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


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

文档中

删除模型

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

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

按主键删除现有模型

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

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

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

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

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

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

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` = ?

推荐