Heim >PHP-Framework >Laravel >Was ist das Prinzip des sanften Löschens in Laravel?

Was ist das Prinzip des sanften Löschens in Laravel?

WBOY
WBOYOriginal
2022-02-22 18:18:302458Durchsuche

In Laravel bedeutet Soft Deletion, dass die Datentabellendatensätze nicht tatsächlich aus der Datenbank gelöscht werden, sondern der Darstellungsstatus der Tabellendatensätze als Soft Deletion markiert wird, sodass die entsprechenden Tabellendatensätze bei der Abfrage gefiltert werden können es wurde „gelöscht“.

Was ist das Prinzip des sanften Löschens in Laravel?

Die Betriebsumgebung dieses Artikels: Windows 10-System, Laravel Version 6, Dell G3-Computer.

Was ist das Prinzip des sanften Löschens in Laravel? Rufen Sie dann die Methode delete auf:

$post = Post::find(5);
if($post->delete()){
    echo '删除文章成功!';
}else{
    echo '删除文章失败!';
}

Diese Methode gibt true oder false zurück.

1.2 Verwenden Sie destroy, um das Modell zu löschen

Wenn die zu löschende Modell-ID bekannt ist, können Sie sie natürlich auch mit der einfacheren Methode destroy direkt löschen:

$deleted = Post::destroy(5);

Das ist möglich Übergeben Sie auch mehrere gleichzeitig. Mehrere Modelle nach Modell-ID löschen: delete方法即可:

$deleted = Post::destroy([1,2,3,4,5]);

该方法返回truefalse

1.2 使用destroy删除模型

当然如果已知要删除的模型id的话,可以用更简单的方法destroy直接删除:

$deleted = Models\Post::where('views', 0)->delete();

你也可以一次传入多个模型id删除多个模型:

<?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;];
}

调用destroy方法返回被删除的记录数。

1.3 使用查询构建器删除模型

既然前面提到Eloquent模型本身就是查询构建器,也可以使用查询构建器风格删除模型,比如我们要删除所有浏览数为0的文章,可以使用如下方式:

php artisan make:migration alter_posts_deleted_at --table=posts

返回结果为被删除的文章数。

2、软删除及其相关实现

2.1 软删除实现

上述删除方法都会将数据表记录从数据库删除,此外Eloquent模型还支持软删除。

所谓软删除指的是数据表记录并未真的从数据库删除,而是将表记录的标识状态标记为软删除,这样在查询的时候就可以加以过滤,让对应表记录看上去是被”删除“了。Laravel中使用了一个日期字段作为标识状态,这个日期字段可以自定义,这里我们使用deleted_at,如果对应模型被软删除,则deleted_at字段的值为删除时间,否则该值为空。

要让Eloquent模型支持软删除,还要做一些设置。首先在模型类中要使用SoftDeletestrait,该trait为软删除提供一系列相关方法,具体可参考源码IlluminateDatabaseEloquentSoftDeletes,此外还要设置$date属性数组,将deleted_at置于其中:

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

    ...//其它方法
}

然后对应的数据库posts中添加deleted_at列,我们使用迁移来实现,先执行Artisan命令:

php artisan migrate

然后编辑生成的PHP文件如下:

$post = Post::find(6);
$post->delete();
if($post->trashed()){
    echo '软删除成功!';
    dd($post);
}else{
    echo '软删除失败!';
}

然后运行:

$posts = Post::all();
dd($posts);

这样posts中就有了deleted_at列。接下来,我们在控制器中编写测试代码:

$posts = Post::withTrashed()->get();
dd($posts);

在浏览器中访问http://laravel.app:8000/test,页面输出如下:

当我们再次通过下面这段代码获取所有文章:

$posts = Post::onlyTrashed()->get();
dd($posts);

已经看不到id为6的文章的身影了。

2.2 查询结果包含软删除模型

那如果想要在查询结果中包含软删除的记录呢?可以使用SoftDeletes trait上的withTrashed方法:

$post = Post::find(6);
$post->restore();

执行之后页面显示如下:

id为6的文章又出现在了查询结果中。有时候我们只想要查看被软删除的模型,这也有招,通过SoftDeletes上的onlyTrashed方法即可:

Post::withTrashed()->where('id','>',1)->restore();

执行后页面显示结果如下:

2.3 软删除恢复

有时候我们需要恢复被软删除的模型,可以使用SoftDeletes提供的restore方法:

恢复单个模型

Post::withTrashed()->restore();

恢复多个模型

$post = Post::find(6);
$post->history()->restore();

恢复所有模型

$post = Post::find(6);
$post->forceDelete();

恢复关联查询模型

rrreee

2.4 强制删除

如果模型配置了软删除但我们确实要删除改模型对应数据库表记录,则可以使用SoftDeletes提供的forceDeleterrreee

Rufen Sie die Methode destroy auf, um die Anzahl der gelöschten Datensätze zurückzugeben.

1.3 Verwenden Sie den Abfrage-Builder, um das Modell zu löschen.

Da bereits erwähnt wurde, dass das Eloquent-Modell selbst ein Abfrage-Builder ist, können Sie beispielsweise auch den Abfrage-Builder-Stil verwenden, um das Modell zu löschen Um alle Artikel mit 0 Ansichten zu löschen, können wir die folgende Methode verwenden: rrreeeDas Rückgabeergebnis ist die Anzahl der gelöschten Artikel.

🎜2. Soft-Deletion-Implementierung🎜

🎜🎜2.1 Soft-Deletion-Implementierung🎜🎜🎜Die oben genannten Löschmethoden löschen die Datentabellendatensätze aus der Datenbank Das Modell unterstützt auch das sanfte Löschen. 🎜🎜Das sogenannte Soft-Deletion bedeutet, dass die Datentabellendatensätze nicht tatsächlich aus der Datenbank gelöscht werden, sondern der Identifikationsstatus der Tabellendatensätze als Soft-Deletion markiert wird, sodass er bei der Abfrage gefiltert werden kann, sodass die entsprechende Tabelle angezeigt wird Datensätze scheinen gelöscht zu sein. Laravel verwendet ein Datumsfeld als Identifikationsstatus. Hier verwenden wir deleted_at. Wenn das entsprechende Modell vorläufig gelöscht ist, ist der Wert von deleted_at Feld ist Zeit entfernen, andernfalls ist der Wert leer. 🎜🎜Damit das Eloquent-Modell das sanfte Löschen unterstützt, müssen einige Einstellungen vorgenommen werden. Verwenden Sie zunächst das Merkmal SoftDeletes in der Modellklasse. Weitere Informationen finden Sie im Quellcode IlluminateDatabaseEloquentSoft , müssen Sie das Attributarray $date festlegen und deleted_at darin platzieren: 🎜rrreee🎜Dann fügen Sie die Spalte deleted_at zum entsprechenden Datenbank- hinzu Beiträge, wir verwenden Migration. Um dies zu erreichen, führen Sie zunächst den Artisan-Befehl aus: 🎜rrreee🎜 Bearbeiten Sie dann die generierte PHP-Datei wie folgt: 🎜rrreee🎜 Führen Sie dann Folgendes aus: 🎜rrreee🎜 Auf diese Weise wird ein deleted_at Spalte in beiträge . Als nächstes schreiben wir den Testcode in den Controller: 🎜rrreee🎜Besuchen Sie http://laravel.app:8000/test im Browser, die Seitenausgabe ist wie folgt: 🎜🎜 🎜🎜 Verdammt, wir bekommen alle Artikel noch einmal über den folgenden Code: 🎜rrreee🎜Der Artikel mit der ID 6 ist nicht mehr sichtbar. 🎜🎜🎜2.2 Abfrageergebnisse enthalten ein Soft-Deletion-Modell🎜🎜🎜Was passiert, wenn Sie Soft-Deleted-Datensätze in die Abfrageergebnisse einbeziehen möchten? Sie können die Methode withTrashed für das Merkmal SoftDeletes verwenden: 🎜rrreee🎜Nach der Ausführung wird die Seite wie folgt angezeigt: 🎜🎜🎜🎜Der Artikel mit der ID 6 erscheint in Die Abfrage führt erneut zu Ergebnissen. Manchmal möchten wir nur die vorläufig gelöschten Modelle anzeigen. Es gibt eine Möglichkeit, dies zu tun. Wir können die Methode onlyTrashed für SoftDeletes verwenden: 🎜rrreee🎜Nach der Ausführung Auf der Seite werden die folgenden Ergebnisse angezeigt: 🎜🎜🎜🎜🎜2.3 Sanfte Löschwiederherstellung🎜🎜🎜 Manchmal müssen wir vorläufig gelöschte Modelle wiederherstellen. Sie können die von SoftDeletes bereitgestellte Methode <code>restore verwenden : 🎜🎜🎜Einzelnes Modell wiederherstellen🎜🎜rrreee🎜🎜Mehrere Modelle wiederherstellen🎜🎜rrreee🎜🎜Alle Modelle wiederherstellen🎜🎜rrreee🎜🎜Zugehörige Abfrage wiederherstellen Löschen erzwingen🎜🎜🎜Wenn das Modell ist mit sanftem Löschen konfiguriert, aber wir möchten es wirklich. Um die dem Modell entsprechenden Datenbanktabellendatensätze zu löschen, können Sie die von SoftDeletes bereitgestellte Methode forceDelete verwenden: 🎜rrreee🎜Anschauen In der Datentabelle können Sie feststellen, dass der Tabellendatensatz mit der ID=6 gelöscht wurde: 🎜🎜🎜🎜🎜【Verwandte Empfehlungen: 🎜Laravel-Video-Tutorial🎜】🎜

Das obige ist der detaillierte Inhalt vonWas ist das Prinzip des sanften Löschens in Laravel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn