与laravel中的软删除相关的问题

时间:2017-10-27 07:21:05

标签: laravel soft-delete

我对laravel中的软删除有一些疑问。我已经搜索了它的作用和含义,而关于软删除最容易理解的部分来自这句话

  

"当模型被软删除时,它们实际上并未从您的模型中删除   数据库。而是在模型上设置deleted_at属性   插入数据库。如果模型具有非null的deleted_at   值,模型已被软删除。为a启用软删除   模型,使用Illuminate \ Database \ Eloquent \ SoftDeletes特征   模型并将deleted_at列添加到$ dates属性:"

所以我的问题基于这句话:

Q1:

  

所以当我在我的代码中使用软删除时,以及当我尝试删除一些时   数据,视图页面(blade.php)中的数据是否会消失   数据库还包含那些数据吗?

Q2:

  

我看到有人使用静态::删除的东西,我不知道   真的很明白这是怎么回事?你能解释它的作用吗?谢谢   你

问题3:

  

如何使用软删除删除数据?我看到人们只是放   一些东西进入他们的模型而不是使用按钮,这意味着什么   你只能在模型中手动删除它而不仅仅是   点击视图页面中的删除按钮?

5 个答案:

答案 0 :(得分:3)

问题1

默认:是。
这取决于您的查询。使用软删除时,Laravel将默认查询软删除的所有模型。如果您还想获得软删除的模型,则需要在查询中调用withTrashed()方法。在这里阅读更多:
https://laravel.com/docs/5.5/eloquent#querying-soft-deleted-models

要了解withTrashed()的作用,您需要了解软删除的工作原理。软删除模型的工作原理是在名为deleted_at的数据库表中添加一个新列。它的值默认为null。当您软删除模型时,Laravel会将当前时间戳放入该列。因此,该字段不再包含空值。

在使用软删除时查询模型时,Laravel会在查询中附加deleted_at is null条件。调用withTrashed()方法,从查询中删除该条件。

查看default query modifierwithTrashed method的来源。

问题2

那是事件。您可以调用它来告诉Laravel,它应该在发生此事件时执行特定的闭包。在您的示例中,它正在侦听"删除"事件。点击此处了解更多信息:
https://laravel.com/docs/5.5/eloquent#events

问题3

您可以使用forceDelete()方法完全删除软删除模型。请参阅"永久删除模型"在这里:
https://laravel.com/docs/5.5/eloquent#querying-soft-deleted-models

答案 1 :(得分:2)

  

软删除意味着不删除数据库中的记录。所以我们处理一个标志   管理记录是否已删除。

让我用例子解释一下:

在我们的记录中有很多用户,所以我们将一个字段 delete_at 添加到数据库中,默认值为null,这样它的记录就不会被删除。

现在,当我们获取所有用户数据时,我们编写了像

这样的查询
Select * from user where delete_at = null

因此,此查询将返回所有未删除的用户数据。

现在我们删除此用户,因此当我们点击删除按钮时,我们创建自定义查询并使用当前日期时间更新此用户delete_at字段

Update delete_at=date() where user_id = 1

所以现在这个记录是软删除。

现在我回答你的问题:

Q.1)软删除后没有数据显示,因为当我们获取数据时,检查delete_at字段是否为空。

答案 2 :(得分:2)

  

Q1:所以当我在我的代码中使用软删除时,以及当我尝试删除时   一些数据,视图页面(blade.php)中的数据是否会消失   数据库还包含那些数据吗?

是。软删除填充数据库中的deleted_at列。从那以后,Eloquent将不会检索这些数据(除非您要求)。如果您使用自定义SQL请求,则需要添加WHERE deleted_at IS NULL

  

Q2:我看到有人使用静态::删除的东西,我没有   真的很明白这是怎么回事?你能解释它的作用吗?谢谢   你

我不是每天都在使用,但这是一个你可以打电话的事件(见here)自动删除相关内容(例如,如果删除用户,你也可以删除所有帖子这是一种级联删除)

  

问题3:如何使用软删除删除数据?我只看到了人   将一些东西放入他们的模型而不是使用按钮,也是如此   这意味着你只能在模型中手动删除它而不是   只需点击视图页面中的删除按钮?

要使用软删除,您只需$object->detroy($id)$myEloquentRequest->where(...)->delete() 如果要强制进行实际删除(以便从数据库中删除条目),可以使用$flight->forceDelete(); 有关详情,请参阅here。 您可以在任何地方进行删除。单击按钮可将用户带到控制器中的delete()方法。您可以在那里删除或调用模型中的方法来触发删除(可能还有一些更复杂的删除事件......)

答案 3 :(得分:1)

  

Q1:所以当我在我的代码中使用软删除时,当我尝试删除某些数据时,视图页面(blade.php)中的数据是否会在数据库仍包含这些数据时消失?

是的,如果您的模型使用softDelete,则搜索查询将如下所示:Select * from table_name where delete_at = null

  

Q2:我看到有人使用静态::删除的东西,我真的不知道这是怎么回事?你能解释它的作用吗?

您可以执行以下操作:Modelname::destroy($id)静态操作

它会破坏设置$ id的模型对象。在销毁时我的意思是:它会更新deleted_at列,因此应用程序会将其视为软删除对象

  

问题3:如何使用软删除删除数据?我看到人们只是将一些东西放入他们的模型中而不是使用按钮,这是否意味着你只能在模型中手动删除它而不是单击视图页面中的删除按钮?

我的一个项目示例:

我在合作伙伴屏幕上有一个删除按钮,路由到partner/{{ id }}/delete

路线上的

Route::get('/partner/{id}/delete', 'PartnerController@deletePartner');

这个动作是什么:

public function deletePartner($partnerId = 0){

    if ($partnerId > 0){
        Partner::destroy($partnerId);
    }

    return redirect("/partner");
}

所以:如果我点击删除按钮,检查,设置了ID,然后"销毁它" (软删除)。删除后,它会重定向回合作伙伴

修改

  

对于问题3中给出的示例,当您删除数据时,数据库数据是消失还是仅消失?

它只会从视野中消失。在数据库中,它将存储为:

id name ... created_at       updated_at       deleted_at
1  foo  ... 2017-10-01 00:00 2017-10-01 00:00 NULL
2  bar  ... 2017-10-01 00:00 2017-10-01 00:00 2017-10-25 16:00

第一个是非删除,第二个是软删除对象,视图只显示第一个

答案 4 :(得分:1)

澄清你的观点。 1.所以 当我们在代码中使用软删除 时,deleted_at将被更新为从null呈现时间戳,因此在从项目的任何位置查询该特定表中的数据时,这是雄辩的model会自动返回deleted_at设置为NULL的数据,即不会被软删除。

  1. 人们使用名为static :: deletion 的内容。 如果我以正确的方式理解你的问题,你可能会看到这个例子:

    class X-Model扩展了Eloquent {

    public function xy()
    {
        return $this->has_many('XY_Model');
    }
    
    // this is a recommended way to declare event handlers
    protected static function boot() {
        parent::boot();
    
        static::deleting(function($x) { 
         // before delete() method call this
             $user->xy()->delete();
             // do the rest of the cleanup...
        });
    }
    

    } 这是Eloquent事件的用例,用于删除将使用"删除"事件要做清理。

  2. 使用软删除删除数据

  3. 现在调用它之后,您可以从表中软删除数据,如果在模型中正确维护关系,您也可以从其他相关表中软删除数据。这实际上称为级联效应。你要明白的例子。 模型结构:

    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    use App\Utilities\Uuids;
    use Illuminate\Database\Eloquent\SoftDeletes;
    use Iatstuti\Database\Support\CascadeSoftDeletes;
    
    class XFolder extends Model
    {
        use SoftDeletes, CascadeSoftDeletes;
        use Uuids;
        protected $connection = 'XDB';
        protected $table = 'x_folder';
        protected $dates = ['deleted_at'];
        public $incrementing = false;
        protected $cascadeDeletes = ['XReference']; //related table with foreign keys
        protected $visible = [ 'id', 'x_id', 'xz_id', 'at_id', 'title', 'description', 'description', 'status', 'created_on' , 'is_active'];
    
        protected $fillable = [
         'x_id',
         'xz_id',
         'at_id',
         'title',
         'description',
         'status',
         'created_on',
         'is_active'
        ];
    
        public function XReference()
        {
            return $this->hasMany('App\Models\XReference', 'x_id');
        }
    }
    

    现在在控制器中你可以像这样调用:

    public function deleteData($id)
        {
            $results = $this->getModel()->where('id', $id)->deleteData();
            return $results;
        }
    

    这将删除数据(级联格式的软删除)。