Maison >cadre php >Laravel >Développement Laravel : Comment implémenter des associations polymorphes avec Laravel Eloquent ?

Développement Laravel : Comment implémenter des associations polymorphes avec Laravel Eloquent ?

WBOY
WBOYoriginal
2023-06-13 16:41:521681parcourir

Développement Laravel : Comment utiliser Laravel Eloquent pour implémenter des associations polymorphes ?

L'association polymorphe est une fonctionnalité importante de Laravel Eloquent, qui permet à un modèle d'établir des relations avec plusieurs modèles différents. Dans les applications pratiques, le traitement de différents types de données est relativement simple et efficace, notamment dans la conception de bases de données. Dans cet article, nous verrons comment implémenter des associations polymorphes à l'aide de Laravel Eloquent.

1. Qu'est-ce que l'association polymorphe ?

L'association polymorphe fait référence à l'établissement d'une relation d'association entre un modèle et plusieurs modèles différents, qui peut être considérée comme une référence à une catégorie générale. Cela peut apporter de la commodité à de nombreuses applications, telles que :

  1. Les modèles d'image, audio et vidéo peuvent tous établir des associations polymorphes avec des modèles de commentaires, afin que les commentaires puissent être appliqués à plusieurs types de données.
  2. Les utilisateurs peuvent établir des associations polymorphes avec des modèles de commentaires et les appliquer à plusieurs types de données, tels que des articles, des images, des vidéos, etc.
  3. Le modèle de commande peut établir une association polymorphe avec le modèle d'adresse de livraison, de sorte que les commandes puissent être livrées à plusieurs types d'adresses, telles que des domiciles, des entreprises, des points de vente, etc.

2. Méthodes pour implémenter une association polymorphe

Voyons comment utiliser Laravel Eloquent pour implémenter une association polymorphe.

Tout d'abord, nous devons considérer la conception du tableau de données. Nous devons créer une table intermédiaire pour stocker les relations polymorphes entre les modèles. Ce tableau doit contenir les colonnes suivantes :

  1. id : ID de clé primaire de la table ;
  2. target_type : nom du type de modèle cible ;
  3. target_id : ID du modèle cible ;
  4. source_type : nom du type de modèle source ; ID du modèle.
  5. Ce qui suit est un exemple de fichier de migration de base de données :
<?php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

class CreateCommentsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('comments', function (Blueprint $table) {
            $table->id();
            $table->morphs('commentable');
            $table->text('content');
            $table->timestamps();
        });

        Schema::create('votes', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('voteable_id');
            $table->string('voteable_type');
            $table->enum('type', ['up', 'down']);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('comments');
        Schema::dropIfExists('votes');
    }
}

Dans le fichier de migration ci-dessus, nous avons créé deux nouvelles tables : commentaires et votes.

La table des commentaires contient des informations de base sur le modèle de commentaire et la méthode morphs() est utilisée pour implémenter le pointage d'association polymorphe. La table des votes est similaire, utilisant les champs voteable_id et voteable_type pour implémenter une association polymorphe.

Ensuite, nous devons définir la relation d'association dans le modèle Eloquent.

Modèle de commentaire :

<?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;

class Comment extends Model
{
    use HasFactory;

    public function commentable()
    {
        return $this->morphTo();
    }

    public function votes()
    {
        return $this->morphMany(Vote::class, 'voteable');
    }
}

Modèle de vote :

<?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;

class Vote extends Model
{
    use HasFactory;

    public function voteable()
    {
        return $this->morphTo();
    }

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Le code ci-dessus définira des relations polymorphes pour le modèle Comment et le modèle Vote respectivement. Dans le modèle Comment, nous utilisons la méthode morphTo() pour définir l'association polymorphe au commentaire, tandis que dans le modèle Vote, nous utilisons la méthode morphMany() pour définir l'association polymorphe au commentaire.

3. Utiliser l'association polymorphe

Voyons comment utiliser l'association polymorphe.

Créez un commentaire :

$article = Article::find(1);

$comment = $article->comments()->create([
    'content' => 'This is a comment',
]);

Obtenez des votes pour un commentaire :

$votes = $comment->votes;

Obtenez des commentaires pour un article :

$comments = $article->comments;

Vote :

$comment->votes()->create([
    'user_id' => 1,
    'type' => 'up',
]);

L'exemple de code ci-dessus démontre l'utilisation de base des associations polymorphes, que vous pouvez trouver dans le Documentation Laravel Eloquent Plus de détails sur cette fonctionnalité.

Résumé

L'association polymorphe est l'une des fonctionnalités importantes de Laravel Eloquent, qui permet à un modèle d'établir des relations avec plusieurs modèles différents. Très utile dans la conception de bases de données et le développement d'applications. Lorsque vous utilisez Laravel Eloquent pour implémenter des relations polymorphes, vous devez concevoir la table intermédiaire de la relation et définir la relation dans le modèle Eloquent. Nous pouvons utiliser les méthodes morphTo() et morphMany() pour implémenter des relations polymorphes.

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