【问题标题】:Extending Eloquent Models in Laravel (use different tables)在 Laravel 中扩展 Eloquent 模型(使用不同的表)
【发布时间】:2016-07-19 00:10:44
【问题描述】:

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

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

所以我有:

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 表中的任何内容吗?

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

【问题讨论】:

  • 您应该考虑阅读有关Dependency Inversion 的信息。首先为每种类型的潜在客户规划您的接口。您可能会发现构建特征而不是扩展更好,以便将它们解耦?

标签: laravel inheritance eloquent models


【解决方案1】:

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 类抽象化,这样您就不必为它关联表格。仅使用它来分隔常见的功能、关系等...... 当然,正如 cmets 中所建议的,实现接口始终是一个好主意。

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

【讨论】:

  • 感谢 iivannov - 这真的很有帮助!快速跟进(希望保持在原始范围内):我们希望在所有潜在客户类型中都有一个唯一标识符;一个通用的“潜在客户 ID”。你对如何解决这个问题有什么建议吗?如果 Solar Leads 和 Refinance Leads 有正常的独立表,那么显然标准 id 字段将重叠。
  • 我正在尝试学习 Laravel,所以如果我的问题很愚蠢,我深表歉意,但是如果您想获取所有潜在客户,我们可以使用潜在客户::all() 并一起检索所有 RefinanceLeads 和 PurchaseLeads ?我怀疑我在说愚蠢,因为数据存储在 2 个不同的表中。这怎么可能呢?假设我们有一个 Product 模型,然后我们用 ComputerProduct 和 CarProduct 扩展它,有没有办法在不查询 2 个表的情况下获取所有产品?
  • 嗨,这个答案真的很棒。在身份验证保护中使用用户时,我可以制作用户的抽象类和合同吗?像 Coach 扩展 User 实现 UserContract 并喜欢两个或三个模型?没有实现不同的 Guards 并保留默认身份验证?
  • 这对我不起作用。 Laravel 忽略了我的受保护表并尝试使用它从父模型名称中猜到的内容
  • @Popnoodles 我检查过,它也应该可以使用最新版本。如果您遇到任何问题,最好提供有关您的框架版本、模型结构和不起作用的代码的更多信息,以便我们提供帮助。如果您认为信息过多,请创建一个新问题并在 cmets 中分享。
猜你喜欢
  • 2020-06-19
  • 2015-01-10
  • 2015-03-25
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多