欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

删除 和 软删除 有大用 有大大用

删除模型#

要删除模型,必须在模型实例上调用 delete 方法:

$flight = App\Flight::find(1);

$flight->delete();


通过键来删除现有的模型#

在上面的例子中,我们在调用 delete 方法之前会先从数据库中取回模型。然而,如果你已知道了模型中的主键,则可以不用取回模型就能直接删除它。若要这么做,请调用 destroy 方法:

App\Flight::destroy(1);

App\Flight::destroy([1, 2, 3]);

App\Flight::destroy(1, 2, 3);


通过查找来删除模型#

当然,你也可以在一组模型上运行删除查找。在这个例子中,我们将会删除所有被标示为不活跃的航班:

$deletedRows = App\Flight::where('active', 0)->delete();


软删除#

除了从数据库中移除实际记录,Eloquent 也可以「软删除」模型。当模型被软删除时,它们并不会真的从数据库中被移除。而是会在模型上设置一个 deleted_at 属性并将其添加到数据库。如果模型有一个非空值 deleted_at,代表模型已经被软删除了。要在模型上启动软删除,则必须在模型上使用 Illuminate\Database\Eloquent\SoftDeletes trait 并添加 deleted_at 字段到你的 $dates 属性上

<?php

namespace App;

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

class Flight extends Model
{
    use SoftDeletes;

    /**
     * 需要被转换成日期的属性。
     *
     * @var array
     */
    protected $dates = ['deleted_at'];
}


当然,你也应该添加 deleted_at 字段到数据表中。Laravel 结构生成器 包含了一个用来创建此字段的辅助函数:

Schema::table('flights', function ($table) {
    $table->softDeletes();
});


现在,当你在模型上调用 delete 方法时,deleted_at 字段将会被设置成目前的日期和时间。而且,当查找有启用软删除的模型时,被软删除的模型将会自动从所有查找结果中排除。

要确认指定的模型实例是否已经被软删除,可以使用 trashed 方法:

if ($flight->trashed()) {
    //
}


查找被软删除的模型#

包含被软删除的模型#

如上所述,被软删除的模型将会自动从所有的查找结果中排除。然而,你可以通过在查找中调用 withTrashed 方法来强制查找已被软删除的模型:

$flights = App\Flight::withTrashed()
                ->where('account_id', 1)
                ->get();


withTrashed 方法也可以被用在 关联 查找:

$flight->history()->withTrashed()->get();


Where 子句注意事项#

当在你的软删除模型查找增加了 orWhere 子句时,请使用 高级 where 子句 来对 WHERE 子句的逻辑进行分组。例如:

User::where(function($query) {
        $query->where('name', '=', 'John')
              ->orWhere('votes', '>', 100);
        })
        ->get();


这将生成以下 SQL:

select * from `users` where `users`.`deleted_at` is null and (`name` = 'John' or `votes` > 100)


如果 orWhere 子句没有被分组,它将会在包含软删除的纪录中生成以下 SQL:

select * from `users` where `users`.`deleted_at` is null and `name` = 'John' or `votes` > 100


只获取被软删除的模型#

onlyTrashed 方法会  获取已被软删除的模型:

$flights = App\Flight::onlyTrashed()
                ->where('airline_id', 1)
                ->get();


恢复被软删除的模型#

有时候你可能希望「取消删除」一个已被软删除的模型。要恢复一个已被软删除的模型到有效状态,则可在模型实例上使用 restore 方法:

$flight->restore();


你也可以在查找上使用 restore 方法来快速地恢复多个模型:

App\Flight::withTrashed()
        ->where('airline_id', 1)
        ->restore();


与 withTrashed 方法类似,restore 方法也可以被用在 关联 查找上:

$flight->history()->restore();


永久地删除模型#

有时候你可能需要真正地从数据库移除模型。要永久地从数据库移除一个已被软删除的模型,则可使用 forceDelete方法:

// 强制删除单个模型实例...
$flight->forceDelete();

// 强制删除所有相关模型...
$flight->history()->forceDelete();


来自  http://d.laravel-china.org/docs/5.1/eloquent#soft-deleting


laravel5.2总结--软删除

  当模型被软删除时,它们并不会真的从数据库中被移除。而是会在模型上设置一个 deleted_at 属性并将其添加到数据库。如果对应模型被软删除,则deleted_at字段的值为删除时间,否则该值为空。
 

1.做一些设置

  首先在模型类中要使用SoftDeletestrait,该trait为软删除提供一系列相关方法,具体可参考源码Illuminate\Database\Eloquent\SoftDeletes,此外还要设置$date属性数组,将deleted_at置于其中:
<?php 
    namespace App\Models; 

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

    class Post extends Model { 
        use SoftDeletes;
        //...其他一些设置 
        protected $dates = ['deleted_at']; 
    }    

2.向数据库中的相应数据表添加deleted_at字段

  1>这里我们使用数据迁移来实现
  php artisan make:migration alter_posts_deleted_at --table=posts
 
  2>此时在database/migrations文件夹下会生成一个相应文件,更改如下
<?php 
    use Illuminate\Database\Schema\Blueprint; 
    use Illuminate\Database\Migrations\Migration; 

    class AlterPostsDeletedAt extends Migration { 
        /** 
        * Run the migrations. 
        * 
        * @return void 
        */ 
        public function up() { 
            Schema::table('posts', function (Blueprint $table) { 
                $table->softDeletes(); 
            }); 
        } 
        ...//其它方法 
    }                
  3>再次运行命令 php artisan migrate ,发现数据库相应的数据表中已经有deleted_at字段了
 

3.使用方法

  在模型上调用 delete 方法时,deleted_at 字段将会被设置成目前的日期和时间。而且,当查找有启用软删除的模型时,被软删除的模型将会自动从所有查找结果中排除。
  //在模型上调用delete方法
  $post = Post::find(6); $post->delete();
  
//要确认指定的模型实例是否已经被软删除,可以使用 trashed 方法:      if($post->trashed()){     echo '软删除成功!';     dd($post);   }else{     echo '软删除失败!';   }   //查找被软删除的模型   $flights = App\Flight::withTrashed() ->where('account_id', 1) ->get();   //onlyTrashed 方法会只获取已被软删除的模型:   $flights = App\Flight::onlyTrashed() ->where('airline_id', 1) ->get();   //恢复单个已经被软删除的模型   $flight = Flight::withTrashed()-find(1); //这里要注意如果被软删除直接find是查不到的   $flight->restore();   //恢复多个模型   App\Flight::withTrashed() ->where('airline_id', 1) ->restore();   // 强制删除单个模型实例...   $flight->forceDelete();   // 强制删除所有相关模型...   $flight->history()->forceDelete();
  
分类: laravel5.2

来自 https://www.cnblogs.com/redirect/p/6177915.html



普通分类: