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

Posted

技术标签:

【中文标题】在 Laravel 中扩展 Eloquent 模型(使用不同的表)【英文标题】:Extending Eloquent Models in Laravel (use different tables) 【发布时间】: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

我的问题是:

    这种策略有意义吗? 如果是,Eloquent 将如何处理数据?我会有leads 表和refinance_leads 表吗? RefinanceLead 类的新实例会利用leads 表中的任何内容吗?

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

【问题讨论】:

您应该考虑阅读有关Dependency Inversion 的信息。首先为每种类型的潜在客户规划您的接口。您可能会发现构建特征而不是扩展更好,以便将它们解耦? 【参考方案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 中分享。

以上是关于在 Laravel 中扩展 Eloquent 模型(使用不同的表)的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 中的模型继承

laravel 8中扩展模型的工厂

Laravel - 在 Eloquent 模型中返回自定义额外数据

在 Laravel 中使用 Eloquent 在模型中应用语句

没有 laravel 的 Eloquent 选择行不起作用

Laravel:在 API 测试中使用 Eloquent 模型