Maison  >  Article  >  base de données  >  ## L'héritage multi-tables dans Eloquent de Laravel : une approche plus propre ?

## L'héritage multi-tables dans Eloquent de Laravel : une approche plus propre ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-27 01:59:30516parcourir

## Multi-Table Inheritance in Laravel's Eloquent: A Cleaner Approach?

L'héritage multi-tables dans Eloquent de Laravel

La mise en œuvre de l'héritage de table unique peut sembler une solution pratique pour étendre des modèles, mais elle présente des inconvénients tels que augmentation de la taille de la base de données en raison de nombreuses valeurs NULL et de complexités lors de l'interrogation de colonnes spécifiques. Au lieu de cela, l'héritage multi-tables offre une approche plus propre.

Conception de schéma

Créez des tables séparées pour les colonnes partagées et des colonnes uniques pour chaque type de modèle. Par exemple :

  • messages (shared_column)
  • questions (question_column, question_column2)
  • articles (article_column, article_column2)

Modèles éloquents

Définissez le modèle Post comme classe parent.

<code class="php">class Post extends Eloquent {
    // Shared column, relationships, etc.
    
    public function postable(){
        return $this->morphTo();
    }
}</code>

Créez des modèles enfants comme Question pour chaque type postable.

<code class="php">class Question extends Post {
    public function post(){
        return $this->morphOne('Post', 'postable');
    }
}</code>

Utilisation

  • Récupérez tous les messages : $posts = Post::all();
  • Récupérer toutes les questions : $questions = Question::all();
  • Récupérer les colonnes de questions d'un message : $question_column2 = $post-> ;postable->question_column2;
  • Vérifiez de quel type est une publication : echo 'type: '.get_class($post->postable);

Création d'un nouveau Modèles

Implique la création d'enregistrements à la fois dans la table partagée (messages) et dans la table spécifique au type (questions).

<code class="php">$question = new Question(); // Create a question record
$question->question_column = 'test';
$question->save();

$post = new Post(); // Create a post record
$post->shared_column = 'New Question Post';
$post->save();

// Link them together
$question->post()->save($post);</code>

Cette approche garantit une structure de base de données plus efficace et fournit une solution évolutive pour l'héritage de modèle dans 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