Silverstripe数据对象指定表名

时间:2017-02-20 16:32:11

标签: php orm silverstripe

有没有办法覆盖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

2 个答案:

答案 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"