Laravel5.7 Eloquent ORM快速入门详解(6)

删除模型

要删除一个模型,调用模型实例上的 delete 方法:

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

通过主键删除模型

在上面的例子中,我们在调用 delete 方法之前从数据库中获取该模型,不过,如果你知道模型的主键的话,可以调用 destroy 方法直接删除而不需要获取它:

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

通过查询删除模型

当然,你还可以通过查询删除多个模型,在本例中,我们删除所有被标记为无效的航班:

$deletedRows = App\Flight::where('active', 0)->delete();

注:通过 Eloquent 进行批量删除时,deleting 和 deleted 模型事件在删除模型时不会被触发,这是因为在进行模型删除时不会获取模型。

软删除

除了从数据库物理删除记录外,Eloquent 还可以对模型进行“软删除”。当模型被软删除后,它们并没有真的从数据库删除,而是在模型上设置一个 deleted_at 属性并插入数据库,如果模型有一个非空 deleted_at 值,那么该模型已经被软删除了。要启用模型的软删除功能,可以使用模型上的Illuminate\Database\Eloquent\SoftDeletes trait 并添加 deleted_at 列到 $dates 属性:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Flight extends Model
{
 use SoftDeletes;

 /**
  * 应该被调整为日期的属性
  *
  * @var array
  */
 protected $dates = ['deleted_at'];
}

当然,应该添加 deleted_at 列到数据表。Laravel Schema 构建器包含一个辅助函数来创建该数据列:

Schema::table('flights', function ($table) {
 $table->softDeletes();
});

现在,当调用模型的 delete 方法时,deleted_at 列将被设置为当前日期和时间,并且,当查询一个使用软删除的模型时,被软删除的模型将会自动从查询结果中排除。

判断给定模型实例是否被软删除,可以使用 trashed 方法:

if ($flight->trashed()) {
 //
}

查询被软删除的模型

包含软删除模型

正如上面提到的,软删除模型将会自动从查询结果中排除,不过,如果你想要软删除模型出现在查询结果中,可以使用 withTrashed 方法:

$flights = App\Flight::withTrashed()
   ->where('account_id', 1)
   ->get();

withTrashed 方法也可以用于关联查询中:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5967.html