2017-01-27 15 views
0

私はEloquentを使っていくつかのモデルが定義されたプロジェクトを持っています。これはほとんどの場合単純明快ですが、私は新しいケースを扱う方法を理解するのに問題があります。私は問題をあいまいにしている場合に備えて、ララベル/雄弁な用語を使用しないようにします。Laravelでモデル継承を処理するにはどうすればよいですか?

フィールドid, QuestionTypeID, QuestionStatementを持つQuestionというテーブルがあります。

QuestionTypeIDに基づいて、追加のテーブルの情報を取得したり、PHPコード内のさまざまなビジネスロジックを使用したりするさまざまな種類の質問をインスタンス化する必要があります。

interface Question { 
    int id; 
    string statement; 
    function ask($params); 
    // + CRUD stuff I suppose 
} 

がどのように私は別の質問のモデルを持って対処することができます。

これらの問題タイプのすべてのような共通のインタフェースを実装するだろうか? Eloquentモデルは本質的に特定のテーブルに結びついていませんか?

私は(論理は、一部のルックアップテーブルから取り出して応答を返します)とTimeFrameQuestion(一部のTimeFrameモジュールへの呼び出しを必要とするロジック)を持っています。

唯一のテーブルTimeFrameQuestionは、他のテーブルと直接の関係がないため、一般的なQuestionテーブルです。

SQLQuestionコレクションがないQuestionテーブルを参照する2つのモデルと、TimeFrameQuestionタイプのレコードの両方を含むことは可能ですか?

+0

「質問」のために期待している他の関係の種類を知らなくても、答えは少し難しいです。どのようにシンプルか複雑かによって、 'QuestionInterface'が良いアプローチになるかもしれませんし、異なる情報を保持するそれぞれの雄弁なモデルのそれぞれが異なる' Question'モデルを持っています。 – Scopey

+0

@Scopeyは迅速な対応を歓迎します。私は質問の編集であなたのコメントに対処しようとしました。 – OGHaza

+0

* Eloquentモデルは本質的に特定のテーブルに結び付けられていないのですか?*いいえ、それは関係を定義しますので、[protect $ table'](https://laravel.com/)を変更することは考えません。 docs/5.3/eloquent#defining-models)をオンザフライで使用することができます。ちょっとしたことに、PHPではフィールドを動的にクラスに追加することができます。 –

答えて

0

私はおそらく間違った方向から問題に近づいていたことに気づきました。何らかのモデル継承ではなく、代わりにコントローラの継承が必要なのかもしれません。

私は私の質問のモデルにAPIによって呼び出されるhandle機能を与え、この関数は、モデルのQuestionType列に基づいて新しいコントローラをインスタンス化ask関数を呼び出し、結果を返します:

class Question extends Model 
{ 
    protected $table = 'Question'; 

    protected $fillable = [ 
     'Statement', 
     'QuestionType' 
    ]; 

    public function handle($parameters) { 
     $class = '\\App\\Modules\\QAndA\\' . $this->QuestionType . 'Controller'; 
     $controller = new $class; 

     return $controller->ask($this->id, $parameters); 
    } 
} 

これらのコントローラ(例:SQLQuestionController,TimeframeQuestionController)はすべて、さまざまな共有機能を定義するQuestionControllerを拡張しており、個々のコントローラは必要なものをオーバーライドします。

関連する問題