Laravel: 软删除一个项目

Laravel: Soft Delete an item

我只想删除我页面上的项目 "overview" 但是我希望将该元素保留在我的数据库中。可能吗?

你知道这个过程吗?

我不知道如何进行软删除,在我的控制器中我有那个

public function destroy(Devis $devis)
     {
         $devis->delete();
         return redirect('/admin');
     }

在我的路线中有

Route::group(['middleware' => ['auth']], function () {
    Route::get('/admin', 'AdminController@getHome');
    Route::get('/valider/{devis}', 'AdminController@destroy');
});

在我的文件概览中有

@foreach($devis as $item)
                <tr>
                   <td> {{$item->firstname}}</td>
                   <td> {{$item->lastname}} </td>
                   <td> {{$item->phone}} </td>
                   <td> {{$item->start_adress}} --  {{$item->start_floor}}</td>
                   <td> {{$item->end_adress}} --  {{$item->end_floor}}</td>
                   <td> {{$item->type_intervention}}</td>
                   <td> {{$item->email}} </td>
                   <td> {{$item->remarks}} </td>
                   <td> <a href="/valider/{{$item->id}}" class="btn btn-danger"><span class="left ion-close"></span></a></td>
                </tr>
              @endforeach

当你想软删除实际上你需要一个标志。假设在您的 table 中有一列 deleted 接受布尔值。

当您在控制器中检索数据以将其传递给视图时,您将查询 table 您只需在查询中添加一个 where 子句,例如:

->where('deleted',0)

所以你得到了 "undeleted" 项。

现在,当您想要软删除时,实际上您并没有删除,而是更新您的列以将其状态设置为 1。

使用这个:Documentation soft deleting 稍后添加到下载项目的条件

->whereNull('deleted_at')

您必须在创建 table 时向 soft delete 添加一个字段。最好迁移。如果是,您将使用 soft delete 那么:

$ item-> delete () - will be softdelete

$ item-> forcedelete () - will permanently delete

Laravel 有它自己的软删除实现。只需将 use SoftDeletes 添加到您的模型,它就会开始工作。尝试阅读 Eloquent - Soft deletes 以详细了解它及其对您的代码的影响。

Laravel 已经看起来 here 所以你在你的模型中添加 deleted_at 并且 正如文档所说,您的模型如下:

  namespace App;

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

class Flight extends Model
{
    use SoftDeletes;

    /**
     * The attributes that should be mutated to dates.
     *
     * @var array
     */
    protected $dates = ['deleted_at'];
}

Using Soft Deletion you mark an item in a way that it's no longer displayed within the application. Laravel natively support soft deletion, you just have to enable it on the specific model where you need it.

Laravel 5或更高版本中,如果您有例如模型Book,为了启用它您需要至:

1.创建一个新迁移

 $ php artisan make:migration add_soft_delete_to_books --table=books

2。修改迁移,添加 "deleted_at" 列 。 Laravel 架构生成器包含一个辅助方法 softDeletes() 来创建此列。

public function up()
{
     Schema::table('books', function(Blueprint $table){
        $table->softDeletes();
    });
 }

public function down()
{
    Schema::table('books', function(Blueprint $table){
        $table->dropColumn('deleted_at');
    });
}

3)运行迁移

$ php artisan migrate

4) 打开Book模型并添加SoftDelete trait

<?php 
    namespace App;
    use Illuminate\Database\Eloquent\Model;
     use Illuminate\Database\Eloquent\SoftDeletes;

 class Book extends Model {  
    use SoftDeletes;  
    protected $dates = ['deleted_at'];  
}  

5) 下次删除与此模型关联的记录时,deleted_at 列将设置为当前时间戳。

任何设置了 deleted_at 时间戳的记录都不会包含在任何检索结果中。 6)如果需要在任何eloquent查询结果中包含软删除记录,可以使用withTrashed方法:

$Books = Book::withTrashed()->get();

你看官方documentation:

1) 为默认用户添加列 table:

`php artisan make:migration add_column_delete_soft --table="user"`(if already migrate)

-在迁移上面添加

$table->SoftDeletes();

-if not migrate then follow this step:

    1) add `$table->SoftDeletes()`; in create_user migration then follow below process as same.
  

2) 输入Model/User.php

-put below package:

 use Illuminate\Database\Eloquent\SoftDeletes;

-添加下面一行:

use SoftDeletes;

-在 $fillable 后添加下行:

protected $dates = ['deleted_at'];

3) 在delete方法中添加Controller,如你所愿。

public  function delete(Request $request)
{
      User::where('email', $request->email)->delete();
}
   

 

4) 如果你想 return Null 然后按照下面的步骤:

内部路线: // 再次软删除数据 null

Route::get('restore/{id}', [AuthController::class, 'restoredata']);

控制器内部:

  public function restoredata(Request $request, $id)
    {
        User::onlyTrashed()->find($id)->restore();
        return 'deleted null Successfully';
    }

用于从数据库中删除所有数据(不是软删除)

-do in controller

$delete_data = User::where('email', $request->email)->forceDelete();