基本问题如何从表映射器中获取'type'列作为整数值?
我有一个运行网站的PHP Zend Framework 1.12应用程序。 MySQL内部是多个具有多列的表。 在两个表中我使用SET类型。该列名为“type”和“set('LOCAL','EXTERNAL')'。请不要将此字段类型与ENUM混淆!
到目前为止没有问题,查询表并将类型列提取为INT或STRING不是问题:
$Sql = $Db->select()->from('tablename', ['type_as_int' => new \Zend_Db_Expr('type+0')]); //returns INT (if both are selected: 3)
$Sql = $Db->select()->from('tablename', ['type']); //returns STRING (if both are selected: LOCAL,EXTERNAL)
但是,在这个应用程序中还有表映射器,它扩展了Zend_Db_Table_Abstract。 映射器内部存在'find()'方法。默认内置于摘要中以按主键查找记录。 但是..当我使用该对象获取记录时,我在populate方法中找到以下响应:
array([type] => LOCAL,EXTERNAL)
手工查询(并自行定义列)将是一个选项($ this-> select() - > from ...),但是不是更优雅的方式吗?
(我知道我使用的是旧版ZF,但此时升级会耗费太多时间。)
答案 0 :(得分:0)
赏金开始后,我注意到没有一个非常简单的答案,所以我开始深入研究Zend Framework 1.12以及我使用的映射器对象。 我注意到了' find()'方法只使用主键列来构建查询。 所以从这些知识开始,我建立了自己的' find()'驻留在“抽象模型映射器”中的方法'并使用' find()'扩展\ Zend_Db_Table_Abstract
的类中的mapper/* sample abstract mapper class with find */
abstract class MapperAbstract {
/*
* Zend db table abstract object
* @var \Zend_Db_Table_Abstract
*/
private $DbTable;
public function find($id, $Model) {
$Select = $this->$DbTable->select(\Zend_Db_Table_Abstract::SELECT_WITH_FROM_PART);
//Fetch record and populate model if we got
//a result
$Row = $this->$DbTable->fetchRow($Select);
//do some extra shizzle
if ($Row !== null) {
return $Model->populate((array)$Row);
}
return;
}
}
现在我需要添加一个覆盖默认列的方法。 所以我创建了一个名为' overrideColumns()'返回一个填充了需要选择或必须覆盖的列名的数组。
/**
* Returns array with columns that need to be overridden
* or selected as extra
* @return array
*/
public function overrideColumns() {
return ['type' => new \Zend_Db_Expr('type+0')];
}
从那时起,我只需要调整$ Select查询,这样就可以使用' overrideColumns()'方法。 所以完整的课程就像:
/* sample abstract mapper class with find */
abstract class MapperAbstract {
/*
* Zend db table abstract object
* @var \Zend_Db_Table_Abstract
*/
private $DbTable;
/**
* Returns array with columns that need to be overridden
* or selected as extra
* @return array
*/
private function overrideColumns() {
return ['type' => new \Zend_Db_Expr('type+0')];
}
public function find($id, $Model) {
$Select = $this->DbTable->select(\Zend_Db_Table_Abstract::SELECT_WITH_FROM_PART);
//Check if we need to override columns in the select query
$overrideColumns = $this->getOverrideColumns();
if (!empty($overrideColumns)) {
$Select->columns($overrideColumns); //overrides the columns
}
//Add where clause to the query
//I know there can also be a compound primary key, but
//I'm just ignoring that in this example
$Select->where($this->DbTable->getPrimaryKeyColumn() . ' = ?', $id);
//doing some extra shizzle
//that is not important when I want to explain stuff
//Fetch record and populate model if we got a result
$Row = $this->DbTable->fetchRow($Select);
if ($Row !== null) {
return $Model->populate((array)$Row);
}
return;
}
}
所以......过了一会儿,我找到了我要找的答案,而不必申报所有栏目。