Maison  >  Article  >  cadre php  >  Quel est le principe de la suppression logicielle dans Laravel

Quel est le principe de la suppression logicielle dans Laravel

WBOY
WBOYoriginal
2022-02-22 18:18:302433parcourir

Dans Laravel, la suppression logicielle signifie que les enregistrements de la table de données ne sont pas réellement supprimés de la base de données, mais que l'état de représentation des enregistrements de la table est marqué comme suppression logicielle, afin que les enregistrements de la table correspondants puissent être filtrés lors de l'interrogation. il a été "supprimé".

Quel est le principe de la suppression logicielle dans Laravel

L'environnement d'exploitation de cet article : système Windows 10, Laravel version 6, ordinateur Dell G3.

Quel est le principe de la suppression logicielle dans Laravel

1 Supprimer le modèle

1.1 Utilisez delete pour supprimer le modèle

La suppression d'un modèle est très simple. Obtenez d'abord l'instance de modèle à supprimer, et. puis appelez deleteMéthode : delete方法即可:

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

该方法返回truefalse

1.2 使用destroy删除模型

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

$deleted = Post::destroy(5);

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

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

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

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

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

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

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

2、软删除及其相关实现

2.1 软删除实现

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

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

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

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

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

php artisan make:migration alter_posts_deleted_at --table=posts

然后编辑生成的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

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

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

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

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

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

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

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

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

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

执行之后页面显示如下:

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

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

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

2.3 软删除恢复

有时候我们需要恢复被软删除的模型,可以使用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();
Cette méthode renvoie true ou false.

1.2 Utilisez destroy pour supprimer le modèle

Bien sûr, si l'ID du modèle à supprimer est connu, vous pouvez utiliser la méthode plus simple destroy pour le supprimer directement : rrreeeVous pouvez en transmettre également plusieurs à la fois. Suppression de plusieurs modèles par ID de modèle :

rrreee🎜Appelez la méthode destroy pour renvoyer le nombre d'enregistrements supprimés. 🎜🎜🎜1.3 Utilisez le générateur de requêtes pour supprimer le modèle🎜🎜🎜Comme il a été mentionné précédemment que le modèle Eloquent lui-même est un générateur de requêtes, vous pouvez également utiliser le style du générateur de requêtes pour supprimer le modèle, par exemple, si nous le souhaitons. supprimez tous les articles avec 0 vue, nous pouvons utiliser la méthode suivante : 🎜rrreee🎜Le résultat renvoyé est le nombre d'articles supprimés. 🎜

🎜2. Suppression logicielle et implémentations associées🎜

🎜🎜2.1 Implémentation de la suppression logicielle🎜🎜🎜Les méthodes de suppression ci-dessus supprimeront les enregistrements de la table de données de la base de données. Le modèle prend également en charge la suppression logicielle. 🎜🎜La soi-disant suppression logicielle signifie que les enregistrements de la table de données ne sont pas réellement supprimés de la base de données, mais que le statut d'identification des enregistrements de la table est marqué comme suppression logicielle, afin qu'ils puissent être filtrés lors de l'interrogation, afin que la table correspondante les enregistrements semblent être supprimés. Laravel utilise un champ de date comme statut d'identification. Ce champ de date peut être personnalisé. Ici, nous utilisons deleted_at. Si le modèle correspondant est supprimé de manière logicielle, la valeur du champ deleted_at. est l'heure de suppression, sinon la valeur est vide. 🎜🎜Pour que le modèle Eloquent prenne en charge la suppression logicielle, certains paramètres doivent être définis. Tout d'abord, utilisez le trait SoftDeletes dans la classe de modèle. Ce trait fournit une série de méthodes associées pour la suppression logicielle. Pour plus de détails, veuillez vous référer au code source IlluminateDatabaseEloquentSoftDeletes. , vous devez définir le $date Tableau d'attributs, y placer deleted_at : 🎜rrreee🎜Ensuite, ajoutez la colonne deleted_at à la base de données correspondante posts, nous utilisons la migration Pour y parvenir, exécutez d'abord la commande Artisan : 🎜rrreee🎜 Puis éditez le fichier PHP généré comme suit : 🎜rrreee🎜 Puis exécutez : 🎜rrreee🎜 De cette façon, il y aura un deleted_at dans posts . Ensuite, nous écrivons le code de test dans le contrôleur : 🎜rrreee🎜Visitez http://laravel.app:8000/test dans le navigateur, le résultat de la page est le suivant : 🎜🎜 🎜🎜 Dang Nous récupérons à nouveau tous les articles via le code suivant : 🎜rrreee🎜L'article avec l'identifiant 6 n'est plus visible. 🎜🎜🎜2.2 Les résultats de la requête contiennent un modèle de suppression logicielle🎜🎜🎜Que faire si vous souhaitez inclure les enregistrements supprimés de manière logicielle dans les résultats de la requête ? Vous pouvez utiliser la méthode withTrashed sur le trait SoftDeletes : 🎜rrreee🎜Après exécution, la page s'affiche comme suit : 🎜🎜🎜🎜L'article avec l'identifiant 6 apparaît dans les résultats de la requête à nouveau. Parfois, nous voulons simplement afficher les modèles supprimés de manière logicielle. Il existe un moyen de le faire. Nous pouvons utiliser la méthode onlyTrashed sur SoftDeletes : 🎜rrreee🎜Après l'exécution, le La page affichera les résultats suivants : 🎜🎜🎜🎜🎜2.3 Récupération après suppression logicielle🎜🎜🎜 Parfois, nous devons restaurer des modèles supprimés de manière logicielle, vous pouvez utiliser la méthode restore fournie par SoftDeletes  : 🎜🎜🎜 Restaurer un seul modèle🎜🎜rrreee🎜🎜Restaurer plusieurs modèles🎜🎜rrreee🎜🎜Restaurer tous les modèles🎜🎜rrreee🎜🎜Restaurer le modèle de requête associé🎜🎜rrreee🎜🎜2.4 Forcer la suppression 🎜🎜🎜Si le modèle est configuré avec la suppression logicielle mais nous voulons vraiment Pour supprimer les enregistrements de la table de base de données correspondant au modèle, vous pouvez utiliser la méthode forceDelete fournie par SoftDeletes : 🎜rrreee🎜En regardant la table de données, vous pouvez constater que l'enregistrement de la table avec l'identifiant = 6 a été supprimé : 🎜🎜🎜🎜🎜【Recommandations associées : 🎜tutoriel vidéo laravel🎜】🎜.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn