Laravel Soft删除帖子

时间:2014-03-15 16:03:03

标签: php laravel laravel-4

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

我们可以将它用于表格上的帖子,例如

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

7 个答案:

答案 0 :(得分:56)

  

当软删除模型时,它实际上并未从您的模型中删除   数据库。而是在记录上设置deleted_at时间戳。至   为模型启用软删除,指定softDelete属性   模型(Documentation):

4.2版之前(但不是4.2及以后)

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

class Post extends Eloquent {

    protected $table = 'posts';
    protected $softDelete = true;

    // ...
}
  

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

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

/**
 * 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。查询使用软删除的模型时,“已删除”模型将不会包含在查询结果中。要soft delete您可以使用的模型:

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

已删除(软)模型由timestamp标识,如果deleted_at字段为NULL,则不会将其删除,并使用restore方法实际生成{{1} }} field deleted_at。要使用NULL方法永久删除模型。

更新版本(Version 4.2):

forceDelete

更新版本(Version 5.0 & Later):

use Illuminate\Database\Eloquent\SoftDeletingTrait; // <-- This is required

class Post extends Eloquent {

    use SoftDeletingTrait; // <-- Use This Insteaf Of protected $softDelete = true;

    protected $table = 'posts';

    // ...
}

答案 1 :(得分:17)

您实际上是正常删除。但是在模型上,您指定它是一个软删除模型。

所以在你的模型上添加代码:

class Contents extends Eloquent {

    use SoftDeletingTrait;

    protected $dates = ['deleted_at'];

}

然后在您的代码上执行正常删除,如:

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

另外,请确保您的桌子上有deleted_at列。

或者只看文档:{​​{3}}

答案 2 :(得分:4)

只是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'];

答案 3 :(得分:2)

在Laravel 5.5 Soft Deleted作品中(对我而言)。

数据库

deleted_at 字段,默认 NULL

<强>模型

use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model {
    use SoftDeletes;
}

<强>控制器

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

答案 4 :(得分:1)

在最新版本的Laravel中,即 Laravel 5.0以上。执行此任务非常简单。 在模型中,在类内部只需编写“ use SoftDeletes”。例子

<?php

namespace App;

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

class User extends Model
{
    use SoftDeletes;
}

然后在Controller中,您可以删除。例子

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

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

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

答案 5 :(得分:0)

以下是laravel.com的详细信息

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

软删除模型时,实际上并未从数据库中删除它。而是在记录上设置deleted_at时间戳。要为模型启用软删除,请在模型上指定softDelete属性:

class User extends Eloquent {

    protected $softDelete = true;

}

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

$table->softDeletes();

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

答案 6 :(得分:0)

我刚刚在 Laravel 8 上做到了这一点,它奏效了。这基本上是@The alpha 所说的,但试图更快地包装所有内容。请按照以下步骤操作。

迁移文件中添加:

$table->softDeletes();

模型中:

use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model
{
    use SoftDeletes;
    ...
];

}

控制器中:

$user->delete();

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

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