Php Silverstripe数据对象指定表名
有没有一种方法可以覆盖SS数据对象的默认行为,这样当我将静态$table_name属性分配给我的DataObject时,开发/构建不会像通常那样创建具有DO名称的表名 例如,我有一个非常小的数据对象Php Silverstripe数据对象指定表名,php,orm,silverstripe,Php,Orm,Silverstripe,有没有一种方法可以覆盖SS数据对象的默认行为,这样当我将静态$table_name属性分配给我的DataObject时,开发/构建不会像通常那样创建具有DO名称的表名 例如,我有一个非常小的数据对象 <?php class SalesRep extends DataObject { private static $table_name = 'tbl_users'; } 我试图阻止在dev/build上创建salesrep表,并且我希望ORM知道,当我执
<?php
class SalesRep extends DataObject {
private static $table_name = 'tbl_users';
}
我试图阻止在dev/build上创建salesrep表,并且我希望ORM知道,当我执行$Model->write时;我正在向tbl_用户表而不是salesrep表写入数据,这在SilverStripe 3.x中目前是不可能的。SilverStripe使用约定优先于配置原则,数据库表始终与相关数据对象具有相同的名称 但是,在SS4中,使用名称空间,您可以在配置中定义一个表名。正如@bummzack已经指出的,这是当前的alpha格式 但是,您可以尝试覆盖DataObject的getBaseTable,方法如下:
/**
* Get the name of the base table for this object
*/
public function baseTable() {
return 'tbl_users';
}
但我怀疑它是否能正常工作,因为在其他地方,baseTable属性也是由类名生成的。这在SilverStripe 3.x中目前是不可能的。SilverStripe使用约定优先于配置原则,数据库表始终与相关数据对象具有相同的名称 但是,在SS4中,使用名称空间,您可以在配置中定义一个表名。正如@bummzack已经指出的,这是当前的alpha格式 但是,您可以尝试覆盖DataObject的getBaseTable,方法如下:
/**
* Get the name of the base table for this object
*/
public function baseTable() {
return 'tbl_users';
}
但我怀疑它是否能正常工作,因为在其他地方,baseTable属性也是由类名生成的。这是使用SilverStripe中的ORM的一部分,需要一些时间才能习惯。我可能会从两个不同的角度来看待这个问题 1如果您的目标是向用户显示某个名称,但有不同的表名,那么解决方案是使用单数和复数,然后您可以随意命名数据对象,无论您希望如何
class tbl_users extends DataObject {
private static $singular_name = 'Sales Rep';
private static $plural_name = 'Sales Reps';
...
}
…记住ORM的全部要点是PHP类定义了表,保持表名与您希望在代码中使用的名称相同是有意义的
2如果它必须是一个特定的表,那么您可以将其指定为外部表/内容,以下解决方案之一可能最适合您,或者这是使用SilverStripe中的ORM的一部分,需要一些时间才能习惯。我可能会从两个不同的角度来看待这个问题 1如果您的目标是向用户显示某个名称,但有不同的表名,那么解决方案是使用单数和复数,然后您可以随意命名数据对象,无论您希望如何
class tbl_users extends DataObject {
private static $singular_name = 'Sales Rep';
private static $plural_name = 'Sales Reps';
...
}
…记住ORM的全部要点是PHP类定义了表,保持表名与您希望在代码中使用的名称相同是有意义的
2如果它必须是一个特定的表,那么您可以将其指定为外部表/内容,以下解决方案之一可能最适合您,或者table_name仅适用于仍处于alpha阶段的SilverStripe 4。因此,可能您正在使用另一个版本的SilverStripe 4,或者该功能尚未正确实现?表_名称仅适用于仍处于alpha阶段的SilverStripe 4。因此,可能您正在使用另一个版本的SilverStripe 4,或者该功能尚未正确实现?我正在使用SilverStripe 3.2。现在我明白了为什么连baseTable都不起作用了。Silverstripe是一个非常好的框架,但在某些方面严重不足。现在我明白了为什么连baseTable都不起作用了。Silverstripe是一个非常好的框架,但在某些领域严重缺乏。