ホームページ > PHPフレームワーク > Laravel > Laravelのソフト削除の原理は何ですか

Laravelのソフト削除の原理は何ですか

WBOY
リリース: 2022-02-22 18:18:30
オリジナル
2461 人が閲覧しました

laravel では、ソフト削除は、データテーブルのレコードが実際にはデータベースから削除されないことを意味しますが、テーブルレコードの表現ステータスはソフト削除としてマークされ、クエリ中にフィルターできるようになります。対応するテーブル レコードは「削除」されたように見えます。

Laravelのソフト削除の原理は何ですか

#この記事の動作環境: Windows 10 システム、Laravel バージョン 6、Dell G3 コンピューター。

laravel のソフト削除の原理とは何ですか

1. モデルを削除します

1.1 delete を使用してモデルを削除します

モデルの削除は非常に簡単です。まず、削除するモデル インスタンスを取得し、次に delete メソッドを呼び出します:

$post = Post::find(5);
if($post->delete()){
    echo '删除文章成功!';
}else{
    echo '删除文章失败!';
}
ログイン後にコピー

このメソッドは true を返します または false

1.2 destroy を使用してモデルを削除します

もちろん、削除するモデル ID がわかっている場合は、より簡単な方法を使用して直接削除できます destroy:

$deleted = Post::destroy(5);
ログイン後にコピー

一度に複数のモデル ID を渡すことで、複数のモデルを削除することもできます。

$deleted = Post::destroy([1,2,3,4,5]);
ログイン後にコピー

destroy メソッドを呼び出して、モデル ID の数を返します。削除された記録。

1.3 クエリ ビルダーを使用してモデルを削除する

Eloquent モデル自体がクエリ ビルダーであることは前述したため、クエリ ビルダー スタイルを使用することもできます。たとえば、ビューが 0 の記事をすべて削除するには、次のメソッドを使用できます:

$deleted = Models\Post::where('views', 0)->delete();
ログイン後にコピー

返される結果は、削除された記事の数です。

2. ソフト削除とその関連実装

2.1 ソフト削除の実装

上記の削除メソッドはデータを記録します。 table データベースからの削除 さらに、Eloquent モデルはソフト削除もサポートしています。

いわゆるソフト削除とは、データ テーブルのレコードが実際にはデータベースから削除されないことを意味しますが、テーブル レコードの識別ステータスはソフト削除としてマークされ、クエリ時にフィルタリングできるようになります。対応するテーブルのレコードが「削除」されたようです。 Laravel は識別ステータスとして日付フィールドを使用します。この日付フィールドはカスタマイズできます。ここでは deleted_at を使用します。対応するモデルが論理的に削除されている場合、deleted_at フィールドの値は次のようになります。削除時刻。それ以外の場合、値は空です。

Eloquent モデルでソフト削除をサポートするには、いくつかの設定を行う必要があります。まず、モデル クラスで SoftDeletes トレイトを使用します。このトレイトは、論理的な削除に関連する一連のメソッドを提供します。詳細については、ソース コード Illuminate\Database\Eloquent\SoftDeletes## を参照してください。 #. さらに、 # #$dateAttribute 配列を設定し、その中に deleted_at を配置する必要があります: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Post extends Model { use SoftDeletes; //设置表名 public $table = &amp;#39;posts&amp;#39;; //设置主键 public $primaryKey = &amp;#39;id&amp;#39;; //设置日期时间格式 public $dateFormat = &amp;#39;U&amp;#39;; protected $guarded = [&amp;#39;id&amp;#39;,&amp;#39;views&amp;#39;,&amp;#39;user_id&amp;#39;,&amp;#39;updated_at&amp;#39;,&amp;#39;created_at&amp;#39;]; protected $dates = [&amp;#39;delete_at&amp;#39;]; }</pre><div class="contentsignin">ログイン後にコピー</div></div>次に、

deleted_at

列を対応するデータベース posts を実装するには、移行を使用します。最初に Artisan コマンドを実行します: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">php artisan make:migration alter_posts_deleted_at --table=posts</pre><div class="contentsignin">ログイン後にコピー</div></div> 次に、生成された PHP ファイルを次のように編集します:

<?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(&#39;posts&#39;, function (Blueprint $table) {
            $table->softDeletes();
        });
    }

    ...//其它方法
}
ログイン後にコピー

次に、次のコマンドを実行します:

php artisan migrate
ログイン後にコピー

This way

posts

deleted_at 列があります。次に、コントローラーにテスト コードを記述します。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">$post = Post::find(6); $post-&gt;delete(); if($post-&gt;trashed()){     echo '软删除成功!';     dd($post); }else{     echo '软删除失败!'; }</pre><div class="contentsignin">ログイン後にコピー</div></div> ブラウザで

http://laravel.app:8000/test

にアクセスすると、ページ出力は次のようになります。

##次のコードを使用してすべての記事を再度取得すると、

$posts = Post::all();
dd($posts);
ログイン後にコピー
ID 6 の記事は表示されなくなります。

2.2 クエリ結果に論理的に削除されたモデルが含まれる

クエリ結果に論理的に削除されたレコードを含めたい場合はどうすればよいですか? SoftDeletes トレイトで

withTrashed

メソッドを使用できます: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">$posts = Post::withTrashed()-&gt;get(); dd($posts);</pre><div class="contentsignin">ログイン後にコピー</div></div>実行後、ページは次のように表示されます:

#id ​​スコア 6 の記事がクエリ結果に再び表示されます。場合によっては、論理的に削除されたモデルを表示したいだけです。

SoftDeletes

onlyTrashed

メソッドを使用してこれを行う方法があります:

$posts = Post::onlyTrashed()->get();
dd($posts);
ログイン後にコピー
ページには、実行後の結果は次のとおりです:

2.3 論理的な削除の回復

論理的に削除されたモデルを復元する必要がある場合があります。 use

SoftDeletes 提供されている restore

メソッド:

単一モデルを復元します

$post = Post::find(6);
$post->restore();
ログイン後にコピー

複数のモデルを復元します

Post::withTrashed()->where('id','>',1)->restore();
ログイン後にコピー

すべてのモデルを復元

Post::withTrashed()->restore();
ログイン後にコピー

関連するクエリ モデルを復元#

$post = Post::find(6);
$post->history()->restore();
ログイン後にコピー

2.4 強制削除

モデルが論理的な削除で構成されているが、モデルに対応するデータベース テーブル レコードを実際に削除したい場合は、

SoftDeletes

が提供する forceDelete メソッドを使用できます。

$post = Post::find(6);
$post->forceDelete();
ログイン後にコピー

でデータ テーブルを表示します。 id=6 のテーブル レコードが削除され、存在していないことがわかります。

[関連する推奨事項] :

laravel ビデオチュートリアル

]

以上がLaravelのソフト削除の原理は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート