Cakephp 从模型名计算表名

Cakephp 从模型名计算表名,cakephp,Cakephp,在我的CakePHP应用程序中,我有这样一个模型: class Duck extends AppModel { var $name = 'Duck'; function get_table_name() { $tbl_name = //compute default table name for this model } } class Duck extends Bird { var $name = 'Duck'; f

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

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

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

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

编辑: 有几个人指出了
$this->table
的用法。 我做了一些小测试,发现了以下几点:

  • 在我上面提出的问题中,
    $this->table
    确实包含表名
  • 然而,实际上,我的代码看起来更像这样:

    class Duck extends AppModel {
        var $name = 'Duck';
    
        function get_table_name() {
            $tbl_name = //compute default table name for this model         
        }
    }
    
    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->table是空字符串。 我采用这种方法是因为我想在我的两个模型之间共享一些代码。看起来这不是在需要一些公共功能的模型之间共享代码的好方法

  • 你在找这个班

    tableze
    调用两个definctor方法来生成表名:and)

    编辑:

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

    还是方法

    编辑

    这也解决了模型中
    $This->table
    中明显的“重影”问题

    我发现了两件事:

  • Cake使用
    拐点::tableize()
    获取表名仅此一项就足以保证使用
    表格化
    而不是
    多元化
    。你会得到一致的结果

  • $this->table
    不是由
    模型设置的::\u construct()
    除非
    $this->useTable==false
    $this->table==false


  • 如果您知道您没有将
    $this->useTable
    设置为
    false
    ,那么您应该能够在
    $this->table
    上使用此选项。诚然,虽然我只是简单地扫描了源代码,但我还没有真正深入地说明为什么
    $this->table
    有时不起作用。

    要获取模型当前使用的表的名称,可以使用:
    $this->table
    。如果您不手动更改模型的表约定,这在CakePHP更改其约定以使用表名而不是使用屈折符的情况下可能最有用。

    我曾经使用屈折符从模型名获取表名

    $tableName = Inflector::pluralize(Inflector::underscore($model));
    
    但这并不是真正通用的,使用
    useTable
    看起来更好,默认情况下,它将按约定包含表名,如果您有一个与约定不匹配的表,那么您应该通过
    useTable
    手动指定它。因此,在这两种情况下,结果都是正确的

    $this->User->useTable
    

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

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

    这很有帮助。我想知道复数名是否已经存储在某个地方(就像
    $this->name
    存储表名一样)。我试着打印
    $this
    (来自模型),但没有效果。所以,我想拐点是一种方法。对我来说,
    $this->table
    是一个空字符串。我在想,只有将模型的表名设置为非默认名称时,它才会被设置。应该使用$this->useTable,但如果您想手动获取表名,拐点方法很好啊…
    tableze
    当然比generic
    pluralize
    @VivekPandey感觉更好,我同意,
    pluralize
    确实感觉更“脏”现在我已经发现了
    tableze
    方法。我肯定会用它,因为它可能会做一些其他的事情来达到这个结果。@Charles:是的,但只有当你使用多个单词表时才有关系:。它可能只在多个单词表中有关系,但我还是要说,对于OP来说,使用
    屈折因子::pluralize
    将构成一种代码气味,因为我们知道事实上有一个特定的,专门构建的函数。我刚刚检查过,
    $this->table
    在我的例子中是空字符串。这是更好的方法。这并不是因为您可能会破坏cake的未来版本,而是因为访问属性应该比调用整个方法更快。编辑,但它显然不起作用。如果我的模型直接从
    AppModel
    继承,它就可以正常工作。有关详细信息,请参见原始问题中的编辑。是否需要在原始查询中使用表名?如果是这样,则不需要将整个名称与表前缀一起获取:$this->getDataSource()->fullTableName($this)。如果要在模型之间共享代码,可以通过关系,或者将代码放在app_model中如果您不想将模型代码应用于所有模型,您也可以根据需要创建一个模型并将其分配给相应的模型。注意:CakePHP行为是(允许多重继承)。扩展只能得到一个继承(因为您只能有一个超类)。
    $table = empty($this->table) ? Inflector::tableize($this->name) : $this->table;
    $fullTableName = $this->tablePrefix . $table;