【问题标题】:EAV implementation on SIlverStripe ORM with polymorphic relations具有多态关系的 SIlverStripe ORM 上的 EAV 实现
【发布时间】:2017-11-28 05:00:21
【问题描述】:

我需要实现 EAV,并且我被多态关系所束缚。

例如模型是:

  • 产品页面。
  • 属性。
  • AttrValDecimal。
  • AttrValBool。
  • AttrValOtherType

如何正确创建关系属性值和产品值?

每个属性都可以是以下几种类型之一:十进制、布尔值、varchar 列表中的项目、varchar 列表中的少数项目等...
所以与值的关系必须是多态的。

我已经阅读了这部分文档 https://docs.silverstripe.org/en/3/developer_guides/model/relations/#polymorphic-has-one
但仍然无法理清如何实现EAV。

【问题讨论】:

  • 虽然 Silverstripe 是运行 EAV 模型样板的好平台,但它并没有太多开箱即用的功能可以帮助您。
  • 我很乐意看到这种可能性,但我认为需要替换/重载相当数量的核心 ORM 才能使其可行

标签: orm silverstripe entity-attribute-value


【解决方案1】:

我想换一种方式:从值对象到属性有一个 has_one 关系。然后将 Type 枚举添加到 Attribute。

从技术上讲,您的值表将允许每个属性有多个值,但也许这是您需要的功能?

回想起来,处理这种木头的另一种可能更好的方法是使 BooleanAttribute 成为 Attribute 的子类,让 SilverStripe 的多表继承为您工作。

您必须手动编写获取值的 getter,并确定要加入哪个表,但多态有一个不会有任何神奇的解决方法 - 它非常简单。

更大的图景我也会质疑 EAV 是否​​真的是您所需要的 - 它会创建一些非常大的查询并且不适合搜索。如果搜索无关紧要并且只需要灵活的属性,也许 JSON 有效负载会更好?

【讨论】:

  • 将属性存储为 JSON 违反了 1NF 规则。如果您愿意忽略这一点,我同意将您的属性数据存储在 JSON 中。您可能想考虑利用 Silverstripe 的 Config API 和缓存,并优化任何 db 查询以使用 JSON 数据类型(最低 MySQL 5.7 InnoDB、PostgreSQL 9.4 等)或肤浅的 JSON 处理,例如 github.com/phptek/silverstripe-jsontext 模块。跨度>
  • @Sam,感谢您的建议。我会尝试你的技术“每个属性多个值”。我真的需要EAV。拜托,你能看看这个问题stackoverflow.com/q/44778281/1638298 吗?它与当前的严格相关。
猜你喜欢
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多