ホームページ >データベース >mysql チュートリアル >## Laravel の Eloquent における複数テーブルの継承: よりクリーンなアプローチ?

## Laravel の Eloquent における複数テーブルの継承: よりクリーンなアプローチ?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-27 01:59:30616ブラウズ

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

Laravel の Eloquent における複数テーブルの継承

単一テーブル継承の実装は、モデルを拡張するための便利なソリューションのように聞こえるかもしれませんが、次のような欠点があります。多数の NULL 値と特定の列のクエリ時の複雑さにより、データベース サイズが増加します。代わりに、複数テーブルの継承により、よりクリーンなアプローチが提供されます。

スキーマ設計

モデル タイプごとに共有列と一意の列に個別のテーブルを作成します。例:

  • 投稿 (shared_column)
  • 質問 (question_column, question_column2)
  • 記事 (article_column,article_column2)

Eloquent Models

Post モデルを親クラスとして定義します。

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

投稿可能なタイプごとに 質問 などの子モデルを作成します。

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

使用法

  • すべての投稿を取得します。 $posts = Post::all();
  • すべての質問を取得します: $questions = Question::all();
  • 投稿から質問列を取得します: $question_column2 = $post-> ;postable->question_column2;
  • 投稿のタイプを確認します: echo 'type: '.get_class($post->postable);

新規作成モデル

には、共有テーブル (posts) とタイプ固有のテーブル (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>

このアプローチにより、より効率的なデータベース構造が保証され、Laravel でのモデル継承のためのスケーラブルなソリューションが提供されます。

以上が## Laravel の Eloquent における複数テーブルの継承: よりクリーンなアプローチ?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。