web-dev-qa-db-ja.com

Laravel(異なるテーブルを使用)での雄弁なモデルの拡張

Laravelさまざまな種類のリードの追跡を含むアプリケーションを作成しています。たとえば、Refinance leadPurchase leadがあります。

リードは多くの情報と機能を共有しますが、すべてではないので、私の考えはLaravelのLeadクラスを拡張するModelクラスを作成し、次にRefinanceLeadクラスを作成することでした、Leadクラスを拡張します。

だから私は:

class Lead extends Model
{
    // shared lead stuff
}

class RefinanceLead extends Lead
{
    // stuff specific to refinance leads
}

私の質問は:

  1. この戦略は理にかなっていますか?
  2. その場合、Eloquentはどのようにデータを処理するのですか? leadsテーブルとrefinance_leads テーブル?
  3. RefinanceLeadクラスの新しいインスタンスは、leadsテーブルの何かを利用しますか?

ドキュメントを介してこの質問に答えるのに苦労しましたが、これが説明されている場所を見逃した場合は、お知らせください。ありがとう。

12
jackel414

1。はい、親モデルにすべての共通機能を持たせることは完全に理にかなっています。

2。基本的に、各Eloquentモデルは、_protected $table_変数で定義された独自のテーブルからのデータを処理します。親変数をオーバーライドして、すべての異なる子モデルに個別のテーブルを設定できます。 Laravelテーブル名

たとえば、RefinanceLeadインスタンスでgetId()メソッドを使用すると、refinance_leadテーブルからidが返されます。 PurchadeLeadインスタンスで使用すると、idpurchade_tableが廃止されます

_class Lead extends Model
{
    public function getId() {
       return $this->id;
    }
}

class RefinanceLead extends Lead
{
     protected $table = 'refinance_leads';
}

class PurchaseLead extends Lead
{
    protected $table = 'purchase_leads';
}
_

3。正確なニーズはわかりませんが、通常はLeadクラスを抽象化して、関連付けないようにすることをお勧めしますそのためのテーブル。共通の機能や関係などを分離するためだけに使用してください...もちろん、コメントで示唆されているように、インターフェースを実装することは常に良い考えです。

_abstract class Lead extends Model implements LeadContract
{
   // class body
}
_
15
iivannov