Home >PHP Framework >Laravel >What is the principle of soft deletion in laravel
In laravel, soft deletion means that the data table records are not actually deleted from the database, but the representation status of the table records is marked as soft deletion, so that it can be filtered during query, so that The corresponding table record looks like it has been "deleted".
#The operating environment of this article: Windows 10 system, Laravel version 6, Dell G3 computer.
1. Delete the model
1.1 Use delete to delete the model
Deleting a model is very simple. First get the model instance to be deleted, and then call the delete
method:
$post = Post::find(5); if($post->delete()){ echo '删除文章成功!'; }else{ echo '删除文章失败!'; }
This method returns true
or false
.
1.2 Use destroy to delete the model
Of course, if the model ID to be deleted is known, you can delete it directly using a simpler methoddestroy
:
$deleted = Post::destroy(5);
You can also delete multiple models by passing in multiple model IDs at one time:
$deleted = Post::destroy([1,2,3,4,5]);
Call the destroy
method to return the number of deleted records.
1.3 Use the query builder to delete the model
Since it was mentioned earlier that the Eloquent model itself is a query builder, you can also use the query builder style to delete the model. For example, we want to To delete all articles with 0 views, you can use the following method:
$deleted = Models\Post::where('views', 0)->delete();
The return result is the number of deleted articles.
2.1 Soft deletion implementation
The above deletion methods will record the data table Delete from the database. In addition, the Eloquent model also supports soft deletion.
The so-called soft deletion means that the data table records are not actually deleted from the database, but the identification status of the table records is marked as soft deletion, so that it can be filtered when querying, so that the corresponding table records It looks like it has been "deleted". Laravel uses a date field as the identification status. This date field can be customized. Here we use deleted_at
. If the corresponding model is soft-deleted, the value of the deleted_at
field is the deletion time. , otherwise the value is empty.
To make the Eloquent model support soft deletion, some settings need to be made. First, use the SoftDeletes
trait in the model class. This trait provides a series of related methods for soft deletion. For details, please refer to the source code Illuminate\Database\Eloquent\SoftDeletes
. In addition, you must also set $date
Attribute array, place deleted_at
in it:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Post extends Model { use SoftDeletes; //设置表名 public $table = 'posts'; //设置主键 public $primaryKey = 'id'; //设置日期时间格式 public $dateFormat = 'U'; protected $guarded = ['id','views','user_id','updated_at','created_at']; protected $dates = ['delete_at']; }
Then add the deleted_at
column to the corresponding database posts
, we use migration to implement, first execute the Artisan command:
php artisan make:migration alter_posts_deleted_at --table=posts
Then edit the generated PHP file as follows:
<?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(); }); } ...//其它方法 }
Then run:
php artisan migrate
This wayposts# There is a
deleted_at column in ##. Next, we write the test code in the controller:
$post = Post::find(6); $post->delete(); if($post->trashed()){ echo '软删除成功!'; dd($post); }else{ echo '软删除失败!'; }Visit
http://laravel.app:8000/test in the browser, the page output is as follows:
$posts = Post::all(); dd($posts);The article with ID 6 is no longer visible.
2.2 Query results contain soft-deleted models
What if you want to include soft-deleted records in the query results? You can use thewithTrashed method on the
SoftDeletes trait:
$posts = Post::withTrashed()->get(); dd($posts);After execution, the page displays as follows: id The article with a score of 6 appears in the query results again. Sometimes we just want to view the soft-deleted model. There is a way to do this, through the
onlyTrashed method on
SoftDeletes:
$posts = Post::onlyTrashed()->get(); dd($posts);The page displays the results after execution As follows:
2.3 Soft Deletion Recovery
Sometimes we need to restore a soft-deleted model, you can useSoftDeletes Provided
restore method:
Restore a single model
$post = Post::find(6); $post->restore();
Restore multiple models
Post::withTrashed()->where('id','>',1)->restore();
Restore all models
Post::withTrashed()->restore();
Restore associated query model
$post = Post::find(6); $post->history()->restore();
2.4 Forced deletion
If the model is configured with soft deletion but we really want to delete the database table records corresponding to the model, we can use theforceDelete method provided by
SoftDeletes:
$post = Post::find(6); $post->forceDelete();to view the data table It can be found that the table record with id=6 has been deleted and no longer exists: [Related recommendations:
laravel video tutorial]
The above is the detailed content of What is the principle of soft deletion in laravel. For more information, please follow other related articles on the PHP Chinese website!