作为程序员一定要保持良好的睡眠,才能好编程

Laravel数据删除以及软删除的操作方法

发布时间:2020-01-28

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

图片.png
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();


图片.png



//软删除 核心方法

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();