Laravel软删除文章

51

在我们的项目中,我们必须对每个帖子使用软删除。在Laravel文档中,我认为我们只能在表格上使用此功能。

我们可以在类似帖子这样的表上使用软删除吗?

$id = Contents::find($id);
$id->softDeletes();
8个回答

131

更新版本 (5.0及以后版本):

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

class Post extends Model {

    use SoftDeletes;

    protected $table = 'posts';

    // ...
}
当软删除一个模型时,它实际上并没有从数据库中移除。相反,记录上设置了一个deleted_at时间戳。要为模型启用软删除,请在模型上指定softDelete属性(文档)。
对于(版本 4.2):
use Illuminate\Database\Eloquent\SoftDeletingTrait; // <-- This is required

class Post extends Eloquent {

    use SoftDeletingTrait;

    protected $table = 'posts';

    // ...
}

版本4.2之前(但不包括4.2及以后的版本)

例如(使用posts表和Post模型):

class Post extends Eloquent {

    protected $table = 'posts';
    protected $softDelete = true;
    
    // ...
}

要在您的表中添加一个deleted_at列,您可以使用迁移中的softDeletes方法:

例如(posts表的迁移类up方法):

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('posts', function(Blueprint $table)
    {
        $table->increments('id');
        // more fields
        $table->softDeletes(); // <-- This will add a deleted_at field
        $table->timeStamps();
    });
}

现在,当您在模型上调用delete方法时,deleted_at列将被设置为当前的timestamp。当查询使用软删除的模型时,“已删除”的模型将不会被包含在查询结果中。要进行软删除,您可以使用:

$model = Contents::find( $id );
$model->delete();

删除(软删除)的模型可以通过 timestamp 进行识别,如果 deleted_at 字段为 NULL,则表示未被删除,使用 restore 方法会使 deleted_at 字段变为 NULL。 若要永久删除一个模型,则可以使用 forceDelete 方法。


文档已更新,应接受@majidarif的新答案作为正确答案。 - A F
1
我已更新@AakilFernandes,它是针对“版本4.2”之前的版本,这是正确的,所以我认为我不应该因此答案而受到负评,但无论如何 :-) - The Alpha
1
也许按最新更新排序答案的部分会更好?不得不浏览一些历史上不适用的内容似乎有点过时。感谢答案,正是我想要的! - Chad
太棒了!https://www.scratchcode.io/how-to-use-the-laravel-soft-delete/ - Mayank Dudakiya

26

你实际上执行的是普通删除。但在指定模型时,需要将其设置为软删除模型。

因此,在你的模型上添加以下代码:

class Contents extends Eloquent {

    use SoftDeletingTrait;

    protected $dates = ['deleted_at'];

}

然后在您的代码中像平常一样执行删除操作:

$id = Contents::find( $id );
$id ->delete();

请确保您的表中有deleted_at列。

或者查看文档:http://laravel.com/docs/eloquent#soft-deleting


那么,如果要在这个模型中删除普通帖子,应该怎么做? - DolDurma
1
你可以使用 $user->forceDelete(); - majidarif
我的意思是如何不使用SoftDelete?普通模式中的“delete”会从数据库中删除。我认为forceDelete()会从回收站中删除吗? - DolDurma
Laravel 4.2 使用 Trait 来软删除记录。接受的答案在 Laravel 4.2 中无法正常工作。 - Burak Erdem
请确保使用 Illuminate\Database\Eloquent\SoftDeletingTrait; - A F

17

我刚刚使用 Laravel 8 做了这个,它起作用了。基本上就是 @The alpha 说的,但尝试更快地包装所有东西。按照以下步骤进行操作。

迁移文件中添加:

$table->softDeletes();

模型中:

use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model
{
    use SoftDeletes;
    ...
];
控制器中:

}

$user->delete();

奖励: 如果你需要恢复已删除的用户

User::withTrashed()->find($id);->restore();

6

这是关于Laravel 5的最新消息:

Laravel 4.2中:

use Illuminate\Database\Eloquent\SoftDeletingTrait;    
class Post extends Eloquent {

    use SoftDeletingTrait;

    protected $dates = ['deleted_at'];

}

Laravel 5 中的变化:

use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model {

    use SoftDeletes;
    protected $dates = ['deleted_at'];

4
在 Laravel 5.5 中,软删除功能可以正常使用(适用于我)。 数据库 字段deleted_at默认值为NULL模型
use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model {
    use SoftDeletes;
}

控制器

public function destroy($id)
{
    User::find($id)->delete();
}

3
在 Laravel 的最新版本中,即在 Laravel 5.0 以上版本中执行此任务非常简单。在 Model 中,在类内部只需写入“use SoftDeletes”即可。示例如下:
<?php

namespace App;

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

class User extends Model
{
    use SoftDeletes;
}

在控制器中,您可以进行删除。例如:
User::where('email', 'youremail@example.com')->delete();

或者

User::where('email', 'youremail@example.com')->softDeletes();

请确保用户表中必须有“deleted_at”列。

2

以下是来自laravel.com的详细信息:

http://laravel.com/docs/eloquent#soft-deleting

软删除模型时,实际上并没有从数据库中删除。相反,记录上设置了一个deleted_at时间戳。要为模型启用软删除,请在模型上指定softDelete属性:

class User extends Eloquent {

    protected $softDelete = true;

}

要向您的表中添加一个deleted_at列,您可以使用迁移中的softDeletes方法:

$table->softDeletes();

现在,当您调用模型上的删除方法时,deleted_at列将被设置为当前时间戳。当查询使用软删除的模型时,“已删除”的模型将不会包含在查询结果中。


0

更新版本(5.0及更高版本)

为了启用此功能,我们需要在数据库(或迁移)中添加一个deleted_at列,用于映射目的。

例如:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        ...
        $table->softDeletes(); // soft delete
    });
}

此外,我们还需要在模型上使用Illuminate\Database\Eloquent\SoftDeletes特性。
例如:
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model
{
    use SoftDeletes;

}

我们现在可以像以前一样调用delete()方法。
$user->delete();

官方文件请点击此处链接:点击这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接