Cakephp 从模型名计算表名
在我的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
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
中明显的“重影”问题
我发现了两件事:
拐点::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
当然比genericpluralize
@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;