在 Laravel 中扩展 Eloquent 个模型(使用不同的表)

Extending Eloquent Models in Laravel (use different tables)

我正在构建一个涉及跟踪不同类型潜在客户的 Laravel 应用程序。例如,有 Refinance 线索Purchase 线索

由于线索共享很多信息和功能,但不是全部,我的想法是创建一个 Lead class,扩展 Laravel 的 Model class,然后是 RefinanceLead class,它扩展了 Lead class。

所以我会:

class Lead extends Model
{
    // shared lead stuff
}

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

我的问题是:

  1. 这个策略有意义吗?
  2. 如果是,Eloquent 将如何处理数据?我会有 leads table 和 refinance_leads table 吗?
  3. RefinanceLead class 的新实例是否会利用 leads table 中的任何内容?

我无法通过文档回答这个问题,但如果我错过了解释的地方,请告诉我。谢谢。

1. 是的,在父模型中拥有所有通用功能非常有意义。

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

例如,如果您在 RefinanceLead 实例上使用 getId() 方法,它将 return id来自 refinance_lead table。如果您在 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 class 抽象化,这样你就不需要为它关联一个 table 。仅使用它来分隔通用功能、关系等... 当然,正如评论中所建议的那样,实现一个接口总是一个好主意。

abstract class Lead extends Model implements LeadContract
{
   // class body
}