Home  >  Article  >  PHP Framework  >  What is the principle of soft deletion in laravel

What is the principle of soft deletion in laravel

WBOY
WBOYOriginal
2022-02-22 18:18:302434browse

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".

What is the principle of soft deletion in laravel

#The operating environment of this article: Windows 10 system, Laravel version 6, Dell G3 computer.

What is the principle of soft deletion in laravel

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. Soft deletion and its related implementation

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 SoftDeletestrait 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 $dateAttribute 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 = &#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;];
}

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(&#39;posts&#39;, 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:

When we get all the articles again through the following code:

$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 the

withTrashed 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 use

SoftDeletes 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 the

forceDelete 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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn