gpt4 book ai didi

php - 使用\Zend_Db_Table_Abstract::find($id)。 MySQL SET 字段返回字符串而不是(想要的)int

转载 作者:可可西里 更新时间:2023-11-01 06:34:10 25 4
gpt4 key购买 nike

基本问题如何从表映射器中获取“类型”列作为整数值?

我有一个运行网站的 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()”方法。默认内置到摘要中以通过主键查找记录。但是.. 当我使用该对象获取记录时,我在填充方法中发现以下响应:

array([type] => LOCAL,EXTERNAL) 

手动查询(并自己定义列)将是一个选项($this->select()->from...),但没有更优雅的方式吗?

(我知道我用的是老版本的ZF,但是现在升级太费时间了。)

最佳答案

赏金开始后,我注意到没有一个真正简单的答案,所以我开始更深入地研究 Zend Framework 1.12 和我使用的映射器对象。我注意到“find()”方法只使用主键列来构建查询。因此,从这些知识开始,我构建了自己的“find()”方法,该方法驻留在“抽象模型映射器”中,并在扩展\Zend_Db_Table_Abstract 的类中使用“find()”映射器

/* 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()”方法。所以整个类(class)变成了这样的:

/* 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;
}

}

所以..过了一会儿我找到了我正在寻找的答案,而不必声明所有列。

关于php - 使用\Zend_Db_Table_Abstract::find($id)。 MySQL SET 字段返回字符串而不是(想要的)int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27431370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com