扩展Laravel中的雄辩模型(使用不同的表)

时间:2016-03-30 19:38:14

标签: laravel inheritance eloquent models

我正在构建一个涉及跟踪不同类型潜在客户的Laravel应用程序。例如,再融资线索购买线索

由于引导分享了很多信息和功能,但不是全部,我的想法是创建一个Lead类,它扩展了Laravel的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表中的任何内容?
  4. 我在通过文档回答这个问题时遇到了麻烦,但如果我错过了解释的地方,请告诉我。感谢。

1 个答案:

答案 0 :(得分:15)

1。是的,在父模型中拥有所有常用功能是完全合理的。

2. 基本上每个Eloquent模型都会处理protected $table变量中定义的自己的表中的数据。您可以覆盖父变量,为所有不同的子模型设置单独的表。 Laravel Table Names

例如,如果您在 RefinanceLead 实例上使用getId()方法,则会从 refinance_lead 表中返回 id 。如果您在 PurchadeLead 实例上使用它,它将从 purchade_table

中重新提取 id
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
}