今天我們來看看如何刪除數據
delete刪除模型
獲取到模型,執行delete方法就好:
public function destroy($id) { $article = Article::findOrFail($id); if ($article->delete()){ echo '刪除成功'; }else{ echo '刪除失敗'; } }
delete方法會返回一個bool值。
destory刪除模型
相比較delete而言更加簡潔,只要你知道id字段就可以使用:
$delete = \App\Models\Article::destroy(3); // 也可以接受一個數組 // $delete = \App\Models\Article::destroy([1,5,6,7]); return "刪除了{$delete}條數據";
通過某些條件刪除模型
我們可以使用where來滿足我們的業務邏輯:
// deleted來記錄刪除了多少條數據 $deleted = \App\Models\Article::where('id','<',10)->delete();
今日焦點---軟刪除實現
軟刪除其實是一種假刪除,它的核心理念是 加入了一個標記字段,如果已經被軟刪除,這個字段的值就會改變 每次我們查詢時就會過濾這條數據,看上去就像已經被刪除了一樣。
在laravel中 以一個日期字段作為標識,這個日期字段是可以自定義的,我們一般使用 delete_at,當記錄被軟刪除時 delete_at會賦予刪除時間,否則它便是空的。 如果我們要使用軟刪除,需要做一些配置:
要讓Eloquent模型支持軟刪除,還要做一些設置。首先在模型類中要使用SoftDeletestrait,該trait為軟刪除提供一系列相關方法,具體可參考源碼Illuminate\Database\Eloquent\SoftDeletes,此外還要設置$date屬性數組,將deleted_at置於其中:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Article extends Model { use SoftDeletes; // 聲明哪些屬性是可以批量賦值的 protected $fillable = ['title','content','author']; protected $dates = ['delete_at']; }
我們當時創建數據表時並沒有添加delete_at這個字段,下面我們來使用數據庫遷移(migration)添加一下:
php artisan make:migration insert_delete_at_intro_articles --table=articles
編輯如下:
class InsertDeleteAtIntroArticles extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('articles', function (Blueprint $table) { $table->softDeletes(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('articles', function (Blueprint $table) { $table->dropSoftDeletes(); }); } }
確定無誤后執行migrate:
php artisan migrate
這時我們的數據庫就已經生成了這個字段了,緊接着 我們來測試下吧:
Route::get('/trashed', function (){
$article = \App\Models\Article::findOrFail(20);
$article->delete();
if ($article->trashed()){
return '軟刪除成功';
}else{
return '軟刪除失敗';
}
});
現在我的數據庫delete_at字段已經更新了,代碼跑的通,而且我們再使用Article::all()方式獲得所有模型數據時,已經看不到我們軟刪除的數據了,它已經被過濾掉了。
查找已經被刪除的數據
如果我們想要得到已經被刪除的數據可以執行這段代碼:
Route::get('/trashed/get', function (){
$articles = \App\Models\Article::withTrashed()->get();
dd($articles);
});
當然 這個方法會獲取到所有被刪除的數據 無論是普通刪除 還是軟刪除
如果我們只想獲取被軟刪除的數據時,使用這個方法:
Route::get('/only-trashed/get', function (){
$articles = \App\Models\Article::onlyTrashed()->get();
dd($articles);
});
恢復被軟刪除的數據
恢復單個數據模型:
// 獲取被軟刪除的模型 $article = \App\Models\Article::withTrashed()->find(20); $article->restore(); dd($article);
通過條件恢復多個模型:
// 獲取被軟刪除的模型 $articles = \App\Models\Article::withTrashed()->where('id','>',3); $articles->restore(); dd($articles);
恢復所有被軟刪除的模型:
\App\Models\Article::onlyTrashed()->restore();
強制刪除
如果我們配置了軟刪除后確實想要徹底刪除一條數據要怎么辦呢?可以這樣:
$article = \App\Models\Article::find(19); $article->forceDelete();
這條記錄會被徹底刪除,當然我們也可以使用這個方法來刪除已經被軟刪除的數據
