要删除模型,必须在模型实例上调用 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;
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();
当模型被软删除时,它们并不会真的从数据库中被移除。而是会在模型上设置一个 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();
来自 https://www.cnblogs.com/redirect/p/6177915.html