在我的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
。
我做了小测试,发现了以下内容:
$this->table
确实包含表名。但实际上,我的代码看起来更像是这样:
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->表是空字符串。 我采用这种方法是因为我想在两个模型之间共享一些代码。看起来这不是在需要一些常用功能的模型之间共享代码的好方法。
答案 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)
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
我发现了两件事:
Cake使用Inflector::tableize()
获取表名。 仅此就足以保证tableize
使用pluralize
。你会得到一致的结果。
$this->table
未由Model::__construct()
设置,除非$this->useTable === false
和$this->table === false
。
如果您知道自己尚未将$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