Php Silverstripe数据对象指定表名

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知道,当我执

有没有一种方法可以覆盖SS数据对象的默认行为,这样当我将静态$table_name属性分配给我的DataObject时,开发/构建不会像通常那样创建具有DO名称的表名

例如,我有一个非常小的数据对象

<?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是一个非常好的框架,但在某些领域严重缺乏。