Laravel Eloquent - 一张桌子的多个模型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel Eloquent - 一张桌子的多个模型相关的知识,希望对你有一定的参考价值。

我有3个雄辩的模型几乎相同并代表折扣:

  • AbsoluteDiscount
  • OneProductForFreeDiscount
  • 数量折扣

他们都会得到一个名为“canBeApplied(Productable $ productable)”的方法。哪个可以查看给定的产品,然后确定产品是否有资格获得它所代表的折扣。对于那3种不同的折扣,这种方法的实现是不同的。

现在,他们的属性几乎相同。它们都具有以下属性:name,active,valid_from,valid_trough。所以我想我需要有一个单独的数据库表,这些字段/列代表这3个折扣雄辩的模型:

  • ID
  • 那么
  • discountable_type
  • 活性
  • VALID_FROM
  • valid_until

然后,discountable_type列将是折扣的完全限定类名。如果是10美元和20美元的礼品卡,您将使用“礼品卡 - 10美元”和“20美元”这两个名称,并且两者都是“Namspace \ For \ AbsoluteDiscount \ AbsoluteDiscount”的discountable_type。

我在想我需要做的是:

  • 为要扩展的折扣模型创建基本的雄辩模型。
  • 覆盖每个折扣中的where方法,在返回之前附加where方法调用,并将其作为内容('discountable_type','=',AbsoluteDiscount :: class)。

但是我们也有方法:首先,所有,甚至更多需要被覆盖的方法。那么储蓄呢?所有3种折扣模型都需要完成这些步骤。是否有一种简单的方法可以做到这一点,或者这是我不能做的事情?

答案

我想你可以在这里使用这个特性:https://github.com/Nanigans/single-table-inheritance

但是,它基于singleTableTypeField属性,该属性不允许按条件获取子级,只能通过某种type_id列。但我认为修改它以满足您的需求并不是那么困难。

另一答案

嗯,这不是一个多态关系,但看起来有点像它。多态关系指定模型属于一个或多个其他模型。这是不同的情况,因为这些模型不属于其他模型,但都是相似的。我不知道这可能是什么解决方案

以上是关于Laravel Eloquent - 一张桌子的多个模型的主要内容,如果未能解决你的问题,请参考以下文章

从Laravel和Eloquent的桌子中选择所有

Laravel Eloquent,其中字段为 X 或 null

与多个中间表的多对多 Laravel Eloquent 关系

Laravel Eloquent 三个模型之间的多对多关系

Laravel eloquent 检查不存在的多对多关系

Laravel - 模型默认值