有没有办法覆盖SS数据对象的默认行为,这样当我为我的DataObject分配静态$table_name property
时,dev / build不会像通常那样创建一个带有DO名称的表名?
例如,我有这个非常小的数据对象
<?php
class SalesRep extends DataObject {
private static $table_name = 'tbl_users';
}
我正在尝试阻止在dev / build上创建表salesrep,并且我希望ORM知道当我执行$Model->write()
时;我正在写表tbl_users
而不是表salesrep
答案 0 :(得分:3)
SilverStripe 3.x目前无法实现这一目标。 SilverStripe使用&#34;约定优于配置&#34;原则和数据库表始终与相关的DataObject具有相同的名称。
但是,在SS4中,使用命名空间,您可以在配置中定义表名。正如@bummzack已经指出的那样,目前这是alpha版。
但是,您可以尝试覆盖DataObject&#39; getBaseTable()
,其方法如下:
/**
* Get the name of the base table for this object
*/
public function baseTable() {
return 'tbl_users';
}
但我怀疑它会毫无问题地工作,因为在其他地方,baseTable属性再次 - 从类名生成。
答案 1 :(得分:1)
这是使用SilverStripe中的ORM的一部分,可能需要一些时间来习惯。我可能会以两种不同的方式看待这个......
1)如果您的目标是向用户显示某个名称,但具有不同的表名,那么解决方案是使用 singular_name 和 plural_name 然后您可以随意命名DataObject,但是你希望......
val => val !== undefined
..请记住,ORM的重点在于PHP类定义了表,并且保持表名与您在代码中使用的表名相同是有意义的。
2)如果它必须是特定的表格,那么您可以将其指定为外部表格/内容,并且以下解决方案之一可能最适合您... "Save to external Table","External Content Module"或"External Data Module"