laravel 软删除 是需要引入 softDeletes ,
另一个要求是 必须要有 delete_at 字段
所谓软删除就是逻辑删除,当然还有物理删除,逻辑删除指的是数据表记录并未真的从数据库删除,而是将表记录的标识状态标记为软删除,这样在查询的时候就可以加以过滤,让对应表记录看上去是被删除了。
Laravel中使用了一个日期字段作为标识状态,这个日期字段可以自定义,这里我们使用deleted_at,如果对应模型被软删除,则deleted_at字段的值为删除时间,否则该值为空。
1、删除模型
//1、第一种方法
Post::find(5)->delete();
//2、第二种方法
Post::destroy(5)
//3、第三种方法
Post::where('views', 0)->delete();
2、软删除
数据库中添加deleted_at字段
Model中使用SoftDeletes,具体可参考源码Illuminate\Database\Eloquent\SoftDeletes
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Test extends Model
{
use SoftDeletes;
protected $table = 'test';
}
按照1中常规的方法删除即可就被软删除了,find,get,all都将无法查找这些些被软删除后的数据
3、软删除查询
需要在普通的查询前调用withTrashed
Post::withTrashed()->find('1');
Post::withTrashed()->where('id','>',1)->get();
Post::withTrashed()->all();
4、软删除恢复
//恢复单个
Post::withTrashed()->find(1)->restore();
//恢复多个模型
Post::withTrashed()->where('id','>',1)->restore();
//恢复所有模型
Post::withTrashed()->restore();
//调用变量的写法
$this->{$this->getDeletedAtColumn()} = null;
/**
* Get the name of the "deleted at" column.
*
* @return string
*/
public function getDeletedAtColumn()
{
return defined('static::DELETED_AT') ? static::DELETED_AT : 'deleted_at';
}
//定义软删除的字段
5、强制删除
//删除单个
Post::withTrashed()->find(1)->forceDelete();
//删除多个模型
Post::withTrashed()->where('id','>',1)->forceDelete();
//删除所有模型
Post::withTrashed()->forceDelete();
//软删除 核心方法
protected function runSoftDelete()
{
$query = $this->newModelQuery()->where($this->getKeyName(), $this->getKey());
$time = $this->freshTimestamp();
$columns = [$this->getDeletedAtColumn() => $this->fromDateTime($time)];
$this->{$this->getDeletedAtColumn()} = $time;
if ($this->timestamps && ! is_null($this->getUpdatedAtColumn())) {
$this->{$this->getUpdatedAtColumn()} = $time;
$columns[$this->getUpdatedAtColumn()] = $this->fromDateTime($time);
}
$query->update($columns);
}软删除
除了从数据库中真实的删除数据之外,Eloquent 也可以进行软删除操作。当模型是一个软删除模型时,它们并不会真正的从数据库中清除记录。
实际上,它们会将模型的 deleted_at 属性进行设置,并且将其更新到数据库中。
如果模型中的 deleted_at 的值不是 NULL,那么它就被标记为软删除了。
如果你需要启用软删除模型,你需要在模型中引入 Illuminate\Database\Eloquent\SoftDeletes trait,
并且在模型的 $dates 属性中添加 deleted_at 列:
protected $dates = ['deleted_at'];
当然,你应该在数据表中添加 deleted_at 列。Laravel 的 结构生成器 中提供了生成该列的方法:
$flight->trashed() //判断数据是否已经删除
永久的删除模型
有时候你可能希望从数据库中直接删除这个模型。你可以使用 forceDelete 方法来将模型从数据库中永久的删除:
// Force deleting a single model instance...
$flight->forceDelete();
// Force deleting all related modls...
$flight->history()->forceDelete();