laravel では、ソフト削除は、データテーブルのレコードが実際にはデータベースから削除されないことを意味しますが、テーブルレコードの表現ステータスはソフト削除としてマークされ、クエリ中にフィルターできるようになります。対応するテーブル レコードは「削除」されたように見えます。
#この記事の動作環境: Windows 10 システム、Laravel バージョン 6、Dell G3 コンピューター。
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.1 ソフト削除の実装
上記の削除メソッドはデータを記録します。 table データベースからの削除 さらに、Eloquent モデルはソフト削除もサポートしています。
いわゆるソフト削除とは、データ テーブルのレコードが実際にはデータベースから削除されないことを意味しますが、テーブル レコードの識別ステータスはソフト削除としてマークされ、クエリ時にフィルタリングできるようになります。対応するテーブルのレコードが「削除」されたようです。 Laravel は識別ステータスとして日付フィールドを使用します。この日付フィールドはカスタマイズできます。ここでは deleted_at
を使用します。対応するモデルが論理的に削除されている場合、deleted_at
フィールドの値は次のようになります。削除時刻。それ以外の場合、値は空です。
Eloquent モデルでソフト削除をサポートするには、いくつかの設定を行う必要があります。まず、モデル クラスで SoftDeletes
トレイトを使用します。このトレイトは、論理的な削除に関連する一連のメソッドを提供します。詳細については、ソース コード Illuminate\Database\Eloquent\SoftDeletes## を参照してください。 #. さらに、 # #$date
Attribute 配列を設定し、その中に deleted_at
を配置する必要があります: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model
{
use SoftDeletes;
//设置表名
public $table = &#39;posts&#39;;
//设置主键
public $primaryKey = &#39;id&#39;;
//设置日期时间格式
public $dateFormat = &#39;U&#39;;
protected $guarded = [&#39;id&#39;,&#39;views&#39;,&#39;user_id&#39;,&#39;updated_at&#39;,&#39;created_at&#39;];
protected $dates = [&#39;delete_at&#39;];
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
次に、
列を対応するデータベース 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('posts', 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->delete();
if($post->trashed()){
echo '软删除成功!';
dd($post);
}else{
echo '软删除失败!';
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
ブラウザで
にアクセスすると、ページ出力は次のようになります。
$posts = Post::all(); dd($posts);
クエリ結果に論理的に削除されたレコードを含めたい場合はどうすればよいですか? SoftDeletes トレイトで
withTrashed メソッドを使用できます: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">$posts = Post::withTrashed()->get();
dd($posts);</pre><div class="contentsignin">ログイン後にコピー</div></div>
実行後、ページは次のように表示されます:
#id スコア 6 の記事がクエリ結果に再び表示されます。場合によっては、論理的に削除されたモデルを表示したいだけです。
SoftDeletesの onlyTrashed
メソッドを使用してこれを行う方法があります:$posts = Post::onlyTrashed()->get(); dd($posts);
ページには、実行後の結果は次のとおりです:
2.3 論理的な削除の回復論理的に削除されたモデルを復元する必要がある場合があります。 useSoftDeletes 提供されている restore
メソッド:単一モデルを復元します
$post = Post::find(6); $post->restore();
複数のモデルを復元します
Post::withTrashed()->where('id','>',1)->restore();
すべてのモデルを復元
Post::withTrashed()->restore();
関連するクエリ モデルを復元#$post = Post::find(6);
$post->history()->restore();
モデルが論理的な削除で構成されているが、モデルに対応するデータベース テーブル レコードを実際に削除したい場合は、
SoftDeletesが提供する forceDelete メソッドを使用できます。
$post = Post::find(6); $post->forceDelete();
でデータ テーブルを表示します。 id=6 のテーブル レコードが削除され、存在していないことがわかります。
laravel ビデオチュートリアル
]以上がLaravelのソフト削除の原理は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。