在 SilverStripe DataExtension 中重载枚举
Overload Enum in SilverStripe DataExtension
是否可以使用 DataExtension 重载枚举字段?
class Order extends DataObject {
private static $db=array('Status'=>"Enum('Unpaid, Paid','Unpaid')";
}
class OrderExtension extends DataExtension {
private static $db=array('Status'=>"Enum('Unpaid, Paid, Cancelled','Unpaid')"; //doesn't work
}
使用我们目前讨论的方法,这似乎是不可能的。我实现了 OP 的代码并发现了同样的事情,装饰对象的 table(在本例中为 "Order")没有按预期更新。
考虑到开发人员可能会搞砸一些依赖于特定 table 和列规范的核心逻辑,我可以解释为什么这不是通过 DataExtension
实现的。
我做了一些挖掘,发现 OP 想要的 是 可能的,但需要一些代码。查看以下页面:https://docs.silverstripe.org/en/3.3/reference/dataextension/#custom-database-generation 它建议在自定义 DataExtension
上定义一个 augmentDatabase()
方法。
但是,似乎没有任何关于下一步该做什么的详细文档。相反,上面的页面建议检查核心 Versioned
扩展,在对我的整个 SS 项目进行 grep 之后,它是我能找到的唯一 DataExtension
subclass 声明一个 augmentDatabase()
方法。鉴于 Versioned
需要为它装饰的每个 class 处理 x3 tables (SiteTree
, SiteTree_Live
, SiteTree_versions
) 那么它的逻辑是一定会参与其中。然而,我怀疑对于 DataObject 上的自定义实现,事情可能会简单一些。 (除非您也在对 DataObjects 进行版本控制!)。
祝你好运:-)
我不知道如何让 augmentDatabase() 方法起作用,但在与一位同事交谈后,他建议使用 config.yml,这成功了。
Order:
db:
Status: Enum('Unpaid, Paid, Cancelled','Unpaid')
是否可以使用 DataExtension 重载枚举字段?
class Order extends DataObject {
private static $db=array('Status'=>"Enum('Unpaid, Paid','Unpaid')";
}
class OrderExtension extends DataExtension {
private static $db=array('Status'=>"Enum('Unpaid, Paid, Cancelled','Unpaid')"; //doesn't work
}
使用我们目前讨论的方法,这似乎是不可能的。我实现了 OP 的代码并发现了同样的事情,装饰对象的 table(在本例中为 "Order")没有按预期更新。
考虑到开发人员可能会搞砸一些依赖于特定 table 和列规范的核心逻辑,我可以解释为什么这不是通过 DataExtension
实现的。
我做了一些挖掘,发现 OP 想要的 是 可能的,但需要一些代码。查看以下页面:https://docs.silverstripe.org/en/3.3/reference/dataextension/#custom-database-generation 它建议在自定义 DataExtension
上定义一个 augmentDatabase()
方法。
但是,似乎没有任何关于下一步该做什么的详细文档。相反,上面的页面建议检查核心 Versioned
扩展,在对我的整个 SS 项目进行 grep 之后,它是我能找到的唯一 DataExtension
subclass 声明一个 augmentDatabase()
方法。鉴于 Versioned
需要为它装饰的每个 class 处理 x3 tables (SiteTree
, SiteTree_Live
, SiteTree_versions
) 那么它的逻辑是一定会参与其中。然而,我怀疑对于 DataObject 上的自定义实现,事情可能会简单一些。 (除非您也在对 DataObjects 进行版本控制!)。
祝你好运:-)
我不知道如何让 augmentDatabase() 方法起作用,但在与一位同事交谈后,他建议使用 config.yml,这成功了。
Order:
db:
Status: Enum('Unpaid, Paid, Cancelled','Unpaid')