Laravel5.1 模型--刪除


今天我們來看看如何刪除數據

 

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();

這條記錄會被徹底刪除,當然我們也可以使用這個方法來刪除已經被軟刪除的數據

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM