Zend框架 - >数据库表字段前缀,如users.us_name

时间:2010-12-14 09:43:39

标签: php zend-framework zend-db


我正在处理包含许多表的数据库,有许多字段前缀(每个表的两个首字母),所以当我有用户表时我不能使用“name”属性($ user-> name)但我可以使用: $用户> us_name


我有办法简化事情并为表格的每个字段设置自动前缀吗?

2 个答案:

答案 0 :(得分:1)

您必须延长Zend_Db_Table_Row才能完成此任务。幸运的是,ZF明确地为此目的提供了_transformColumn()方法。但我领先于自己。首先,设置表类。这假设您的数据库有一个名为“foo_mytable”的表:

class MyTable extends Zend_Db_Table_Abstract {
    protected $_name = 'foo_mytable';
    protected $_rowClass = 'My_Db_Table_Row';
}

接下来,创建自定义Row类:

class My_Db_Table_Row extends Zend_Db_Table_Row {
    protected function _transformColumn($columnName) {
        $columnName = parent::_transformColumn($columnName);
        $prefix = 'us_';
        return $prefix . $columnName;
    }
}

现在,您可以执行以下操作(为简单起见,此示例忽略了MVC设计理念):

$table = new MyTable();
$records = $table->fetchAll();
foreach ($records as $record) {
    echo $record->name;
}

假设您的表有一个名为“us_name”的列,这应该可行。我亲自测试过。请注意,在自定义表行中,您可能希望从配置文件中获取表前缀。如果您已将其存储在注册表中,则可以将$prefix = 'us_';替换为$prefix = Zend_Registry::get('tablePrefix');

答案 1 :(得分:0)

我不知道_transformColumn()。我要跳到@curtisdf的榜样上 我认为你应该用这个覆盖(未经测试):

protected function _transformColumn($columnName)
{
    $tblName = $this->_table->info(Zend_Db_Table::NAME);
    $prefix  = substr($tblName, 0, 2);

    return $prefix . '_' . parent::_transformColumn($columnName);
}

使用它,您不需要存储前缀/表名,因为它们是以dinamically方式检索的。