从型号名称计算表名称

时间:2011-07-25 15:57:43

标签: cakephp

在我的CakePHP应用程序中,我有一个这样的模型:

class Duck extends AppModel {
    var $name = 'Duck';

    function get_table_name() {
        $tbl_name = //compute default table name for this model         
    }
}

我想编写函数get_table_name(),它输出模型的默认表名。对于上面的示例,它应输出ducks

修改 有几个人指出使用$this->table。 我做了小测试,发现了以下内容:

  1. 在我上面提到的问题中,$this->table确实包含表名。
  2. 但实际上,我的代码看起来更像是这样:

    class Duck extends Bird {
        var $name = 'Duck';
        function get_table_name(){
            $tbl_name = //comput default table name for this model
        }
    }
    class Bird extends AppModel {
    
    }
    

    在这种情况下,$ this->表是空字符串。 我采用这种方法是因为我想在两个模型之间共享一些代码。看起来这不是在需要一些常用功能的模型之间共享代码的好方法。

5 个答案:

答案 0 :(得分:3)

您正在寻找Inflector课程。

Inflector::tableize($this->name) 

tableize调用两个Inflector方法来生成表名:underscore()pluralize()

修改

根据the source code$this->table 应该包含CakePHP将用于模型的表的名称,但根据我的经验,这并不总是设置。我不确定为什么。

答案 1 :(得分:2)

要获取模型当前使用的表的名称,您可以使用:$this->table。如果你不手动更改模型的表约定,那么在CakePHP不断更改其约定以使用除Inflector之外的其他内容的情况下,这可能是最有用的。

答案 2 :(得分:1)

CakePHP's Inflector

function get_table_name() {

    $tbl_name = Inflector::pluralize($this->name);

}

tableize方法

function get_table_name() {

    $tbl_name = Inflector::tableize($this->name);

}

修改

这也解决了模型中$this->table的明显“鬼”问题。

Digging around in the __construct for Model我发现了两件事:

  1. Cake使用Inflector::tableize()获取表名。 仅此就足以保证tableize使用pluralize。你会得到一致的结果。

  2. $this->table未由Model::__construct()设置,除非$this->useTable === false$this->table === false

  3. 如果您知道自己尚未将$this->useTable设置为false,那么您应该可以使用此$this->table。不可否认,虽然我只是简单地扫描了来源,但我并没有真正深入挖掘,以至于为什么$this->table有时无效。

答案 3 :(得分:1)

要获取模型的完整表名,您必须考虑表前缀。

$table = empty($this->table) ? Inflector::tableize($this->name) : $this->table;
$fullTableName = $this->tablePrefix . $table;

答案 4 :(得分:0)

我曾经使用inflector从模型名称

获取表名
$tableName = Inflector::pluralize(Inflector::underscore($model));

但这并不是普遍的,使用useTable看起来更好,默认情况下它会按照约定包含表的名称,如果你有一个与约定不匹配的表,那么你应该通过{手动指定它{1}}。因此,在这两种情况下,结果都是正确的

useTable