Maison  >  Article  >  base de données  >  Comment pouvez-vous implémenter l'héritage de table unique pour les modèles d'article et de question à l'aide d'Eloquent de Laravel, s'étendant du modèle Post ?

Comment pouvez-vous implémenter l'héritage de table unique pour les modèles d'article et de question à l'aide d'Eloquent de Laravel, s'étendant du modèle Post ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-25 05:08:02592parcourir

How can you implement single table inheritance for Article and Question models using Laravel's Eloquent, extending from the Post model?

Implémentation de l'héritage de table unique à l'aide d'Eloquent de Laravel

Question :

Étant donné le modèle Post :

<code class="php">class Post extends Eloquent {

    // Model code...
}</code>

Comment pouvez-vous implémenter l'héritage pour les modèles d'articles et de questions, leur permettant de s'étendre à partir de Post ?

Héritage de table unique

L'héritage de table unique implique le stockage de toutes les données du modèle dans un seul tableau avec une colonne de type pour différencier les modèles. Cependant, cette approche peut conduire à de nombreuses valeurs NULL en raison de colonnes inutilisées pour des types de modèles spécifiques.

Héritage multi-tables

L'héritage multi-tables utilise le polymorphisme, en utilisant des tables distinctes pour chaque modèle tout en les reliant via une table de référence. La table de référence comprend des colonnes comme postable_id et postable_type.

Configuration du modèle éloquent

Dans le modèle Post, définissez une relation morphTo :

<code class="php">public function postable(){
    return $this->morphTo();
}</code>

Dans le modèle Question (similaire à l'article) :

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

Utilisation :

  • Récupérer tous les messages : Post::all()
  • Récupérer toutes les questions : Question::all()
  • Obtenir les détails d'une question à partir d'un message : $question_column2 = $post->postable->question_column2
  • Vérifier le type de message : if( $post->postable instanceof Question)
  • Créez une nouvelle question :
<code class="php">$post = new Post();
$post->shared_column = 'New Question Post';
$post->save();

$question = new Question();
$question->question_column = 'test';
$question->post()->save($post);</code>

Conclusion

L'héritage multi-tables offre un structure de base de données plus efficace par rapport à l'héritage de table unique. Cela nécessite une logique de modèle supplémentaire, mais il fournit une approche plus flexible et évolutive pour gérer l'héritage de modèle dans Eloquent de 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