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

时间:2018-03-01 20:08:02

标签: php mysql laravel eloquent

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

  • AbsoluteDiscount
  • OneProductForFreeDiscount
  • QuantityDiscount

他们都会得到一个名为" 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种折扣模型都需要完成这些步骤。是否有一种简单的方法可以做到这一点,或者这是我不能做的事情?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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