LaravelのEloquentを使用して単一テーブル継承を実装するにはどうすればよいですか?

JasonK

現在、という名前のモデルクラスがありPostます。

class Post extends Eloquent {

    protected $table = 'posts';
    protected $fillable = array('user_id', 'title', 'description', 'views');

    /*
     * Relationships
     */

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

    public function tags()
    {
        return $this->belongsToMany('Tag', 'post_tags');
    }

    public function reactions()
    {
        return $this->hasMany('Reaction');
    }

    public function votes()
    {
        return $this->hasMany('PostVote');
    }

    //Scopes and functions...
}

投稿を2つの異なるタイプに分けたいと思います。articlesおよびquestionsこれを行う最善の方法は継承によるものだと思ったのでArticleQuestion拡張しPostます。これを行うための最良の方法とどこから始めればよいですか?

lukasgeiter

マルチテーブル継承について掘り下げる前にシングルテーブル継承について少し説明しておきたいと思います単一テーブル継承は、dbモデルでの継承に関してはより簡単な方法です。異なるモデルクラスを区別するため
に、同じテーブルとtype列にバインドされた複数のモデルがあります。ただし、通常、継承を実装する理由は、モデルに共有プロパティがあるだけでなく、モデルに固有のプロパティもあるためです。
単一テーブル継承を使用する場合、テーブルはある時点で次のようになります。

id   shared_column   question_column   article_column   question_column2   article_column2 etc...
1    Lorem           62                NULL             test               NULL
2    Ipsum           NULL              x                NULL               true

特定のタイプのモデルに必要のない列があるため、NULL値が多くなることになります。また、レコードが多い場合、これはデータベースのサイズに影響を与える可能性があります。

ただし、場合によっては、それでも最善の解決策になる可能性があります。これは、Laravelに非常にエレガントな方法で実装する方法を示すよく書かれたチュートリアルです。

マルチテーブル継承

次に、マルチテーブル継承を見てみましょう。この方法では、1つのテーブルを複数のテーブルに分割します(名前はすでにそのようなものを与えていると思います;))ポリモーフィズムと呼ばれる手法を使用します

上記の例のスキーマは次のようになります。

posts table:

id   shared_column  postable_id  postable_type
1    Lorem          1            Question
2    Ipsum          1            Article


questions table:

id   question_column   question_column2
1    62                test


articles table:

id   article_column   article_column2
1    x                true

あなたが私に尋ねればはるかにきれいです...

ここで興味深いの列があるpostable_idpostable_typeタイプはモデルの「残り」を見つけるテーブルを示し、IDはそれに属するレコードの主キーを指定します。列名は任意の名前にすることができますが、「-able」と呼ぶのが慣例であることに注意してください

Eloquentモデルを見てみましょう。

役職

class Post extends Eloquent {
    // all your existing code
    
    public function postable(){
        return $this->morphTo();
    }
}

質問/記事/他のすべての投稿可能なタイプ

class Question extends Post {
    public function post(){
        return $this->morphOne('Post', 'postable');
    }
}

実際にはから拡張する必要はありませんがPost、使用したいメソッドがある場合は拡張できることに注意してくださいとにかく、ポリモーフィックな関係はそれがあってもなくても機能します。

これが基本的な設定です。新しいモデルの使用方法は次のとおりです。

すべての投稿を取得する

$posts = Post::all();

すべての質問を取得する

$questions = Question::all();

投稿から質問列を取得する

$post = Post::find(1);
$question_column2 = $post->postable->question_column2;

質問から投稿プロパティを取得する

$question = Question::find(1);
$shared_column = $question->post->shared_column;

投稿の種類を確認してください

$post = Post::find(1);
echo 'type: '.get_class($post->postable);
if($post->postable instanceof Question){
    // Looks like we got a question here
}

新しい質問を作成する

モデルの作成はもう少し複雑です。アプリケーションの複数の場所でそれを行う必要がある場合は、再利用可能な関数を作成することをお勧めします。

// create a record in the questions and posts table

$question = new Question();
$question->question_column = 'test';
$question->save();

$post = new Post();
$post->shared_column = 'New Question Post';
$post->save();

// link them together

$question->post()->save($post);

ご覧のとおり、クリーンなデータベースには価格が付いています。モデルの処理は少し複雑になります。ただし、これらすべての追加ロジック(モデルの作成に必要なものなど)をモデルクラスの関数に入れることができ、あまり心配する必要はありません。

また、laravelを使用したマルチテーブル継承の優れたチュートリアルもあります。多分それは役立ちます;)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

複数のinit継承を使用してsuper()を実装するにはどうすればよいですか?

分類Dev

単一テーブル継承を使用する場合、Ebeanクエリで識別子の値を使用するにはどうすればよいですか?

分類Dev

Laravelの外部でEloquentを使用してテーブル作成クエリを実行するにはどうすればよいですか?

分類Dev

Laravel 5:Eloquentを使用してピボットテーブルで結合クエリを実行するにはどうすればよいですか?

分類Dev

Composerオートローダーを使用して継承を実装するにはどうすればよいですか?

分類Dev

継承を使用してメソッドチェーンを実装するにはどうすればよいですか?

分類Dev

Laravel Eloquent whereIn関数を別のテーブルで使用するにはどうすればよいですか?

分類Dev

Eloquentを使用して、親モデルとその子テーブルを順番に一覧表示するにはどうすればよいですか?

分類Dev

Jestを使用して単一のテストを実行するにはどうすればよいですか?

分類Dev

継承セキュリティルールに違反せずに、.NET 4以降でISerializableを実装するにはどうすればよいですか?

分類Dev

継承されたコントロールのプロパティとしてTextFormatFlagsを使用するにはどうすればよいですか?

分類Dev

別のリンクテーブルを使用してOneToManyアソシエーションを実装するにはどうすればよいですか?

分類Dev

mysqlで単一のクエリを使用して2つのテーブルからデータを取得するにはどうすればよいですか?

分類Dev

Telegram APIを使用して承認を実装するにはどうすればよいですか?

分類Dev

mysql 8のlaravel / eloquentで一般的なテーブル式を実行するにはどうすればよいですか?

分類Dev

SQLを使用して単一のテーブルの2つの行の2つの列の値を比較するにはどうすればよいですか?

分類Dev

Featuretoolsを使用して、即時機能のない単一のテーブルの機能を作成するにはどうすればよいですか?

分類Dev

Jqueryを使用してjavascript演算子シンボルでテーブルの単一列を検索するにはどうすればよいですか?

分類Dev

部分的なクラステンプレートの特殊化で継承を実装するにはどうすればよいですか?

分類Dev

多重継承を使用してDjangoフォームを作成するにはどうすればよいですか?

分類Dev

react-virualisedを使用してテーブルに無限スクロールを実装するにはどうすればよいですか?

分類Dev

複数のテーブルを使用して単一の行を更新するにはどうすればよいですか?

分類Dev

mysqlコマンドラインを使用してテーブルの単一行の内容を表示するにはどうすればよいですか?

分類Dev

CustomOperationsといくつかのletを使用してステートフルビルダーを実装するにはどうすればよいですか?

分類Dev

クラスにインターフェイスを実装し、別のクラスから継承させるにはどうすればよいですか?

分類Dev

Eloquentを使用してテーブル内のすべての行を削除するにはどうすればよいですか?

分類Dev

rxJavaを使用して一連の連続操作を実装するにはどうすればよいですか?

分類Dev

ネイティブJSコードを使用してAngularでアイドル時間を実装するにはどうすればよいですか?

分類Dev

STLスタイルのイテレータを実装して一般的な落とし穴を回避するにはどうすればよいですか?

Related 関連記事

  1. 1

    複数のinit継承を使用してsuper()を実装するにはどうすればよいですか?

  2. 2

    単一テーブル継承を使用する場合、Ebeanクエリで識別子の値を使用するにはどうすればよいですか?

  3. 3

    Laravelの外部でEloquentを使用してテーブル作成クエリを実行するにはどうすればよいですか?

  4. 4

    Laravel 5:Eloquentを使用してピボットテーブルで結合クエリを実行するにはどうすればよいですか?

  5. 5

    Composerオートローダーを使用して継承を実装するにはどうすればよいですか?

  6. 6

    継承を使用してメソッドチェーンを実装するにはどうすればよいですか?

  7. 7

    Laravel Eloquent whereIn関数を別のテーブルで使用するにはどうすればよいですか?

  8. 8

    Eloquentを使用して、親モデルとその子テーブルを順番に一覧表示するにはどうすればよいですか?

  9. 9

    Jestを使用して単一のテストを実行するにはどうすればよいですか?

  10. 10

    継承セキュリティルールに違反せずに、.NET 4以降でISerializableを実装するにはどうすればよいですか?

  11. 11

    継承されたコントロールのプロパティとしてTextFormatFlagsを使用するにはどうすればよいですか?

  12. 12

    別のリンクテーブルを使用してOneToManyアソシエーションを実装するにはどうすればよいですか?

  13. 13

    mysqlで単一のクエリを使用して2つのテーブルからデータを取得するにはどうすればよいですか?

  14. 14

    Telegram APIを使用して承認を実装するにはどうすればよいですか?

  15. 15

    mysql 8のlaravel / eloquentで一般的なテーブル式を実行するにはどうすればよいですか?

  16. 16

    SQLを使用して単一のテーブルの2つの行の2つの列の値を比較するにはどうすればよいですか?

  17. 17

    Featuretoolsを使用して、即時機能のない単一のテーブルの機能を作成するにはどうすればよいですか?

  18. 18

    Jqueryを使用してjavascript演算子シンボルでテーブルの単一列を検索するにはどうすればよいですか?

  19. 19

    部分的なクラステンプレートの特殊化で継承を実装するにはどうすればよいですか?

  20. 20

    多重継承を使用してDjangoフォームを作成するにはどうすればよいですか?

  21. 21

    react-virualisedを使用してテーブルに無限スクロールを実装するにはどうすればよいですか?

  22. 22

    複数のテーブルを使用して単一の行を更新するにはどうすればよいですか?

  23. 23

    mysqlコマンドラインを使用してテーブルの単一行の内容を表示するにはどうすればよいですか?

  24. 24

    CustomOperationsといくつかのletを使用してステートフルビルダーを実装するにはどうすればよいですか?

  25. 25

    クラスにインターフェイスを実装し、別のクラスから継承させるにはどうすればよいですか?

  26. 26

    Eloquentを使用してテーブル内のすべての行を削除するにはどうすればよいですか?

  27. 27

    rxJavaを使用して一連の連続操作を実装するにはどうすればよいですか?

  28. 28

    ネイティブJSコードを使用してAngularでアイドル時間を実装するにはどうすればよいですか?

  29. 29

    STLスタイルのイテレータを実装して一般的な落とし穴を回避するにはどうすればよいですか?

ホットタグ

アーカイブ