- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
基本问题如何从表映射器中获取“类型”列作为整数值?
我有一个运行网站的 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/
在 Zend_Db_Table_Abstract 上,我使用这段代码来获取我选择的结果数: $this->setTableName('visitors'); $select = $this->sele
我正在尝试删除一行,谁能告诉我正确的语法吗? class Application_Model_Event extends Zend_Db_Table_Abstract { protected
我有一个名为: 客户(ID,别名) 帖子(ID,主题) post_client (id, post_id, client_id) 许多客户可以加入一个帖子。 使用 Zend DB Table 抽象我已
我最近继承了一个使用 ZF 编写的应用程序,它在数据库中加密了多个字段。有许多模型使用类似于此示例的代码扩展 Zend_Db_Table_Abstract - insert( array(
我正在使用 Zend_Db_Table_Abstract 中的 insert() 函数。 插入的数据是用户输入的,所以我自然很好奇 ZF 是否为我清理数据,或者我是否应该在调用 insert() 函数
我正在使用 Zend_Db_Table_Abstract 的具体实现: class DB_TestClass extends Zend_Db_Table_Abstract { protecte
如何在使用 Zend_Db_Table_Abstract 时限制对特定列的查询? (下面的 getDbTable() 返回一个 Zend_Db_Table_Abstract 对象) $resultSe
我在这里找不到:http://framework.zend.com/manual/en/zend.db.select.html使用 mysql 对 SUM 的任何引用。 我们如何执行一个简单的: SE
我的站点使用了 2 个数据库,包括一个与其他站点特定数据库相关的中央用户数据库。 有时调用 new User(array('db'=>'adapter1')); 就足够了(但从不方便);但是,在其他时
我构建了一个查询工具,使非技术用户能够查询数据库的部分内容。我想很好地重命名所有列。例如: table_id` > "Table ID" forename > "Forename" phone > "
我的应用程序中有一些情况希望执行 INSERT DELAYED 而不是标准的 INSERT 以加快脚本性能。我有一个可以插入数百行的脚本,并且可能会受益于该功能。 我了解到 zend Framewor
在 ZF1 中,有一个函数 Zend_Db_Table_Abstract::createRow() 可以创建一个新的空白行。然后可以对该新行进行操作并将其存储在表中。 rowID 使用自动增量自动设置
有谁知道用 Zend_Db 对 where 子句进行分组的方法?基本上我有这个查询 $sql = $table->select() ->where('company_id =
在Zend Framework Quickstart ,从扩展 Zend_Db_Table_Abstract 到表数据网关模式的模型发生了变化。 就个人而言,我对这种模式没有太多经验,而且我一直听说最
所以我有我想通过 zend 框架调用的原始 SQL select t.type, t.tid,t.tname,t.cid,t.cname, ls.* from ( select t.t
我认为可以使用 Zend_Db_Select 或 Zend_Db_Table_Abstract 编写选择查询,但我不明白何时使用两者中的哪一个。 一个比另一个更优化?与一个或另一个连接“更容易”吗?
不幸的是,我创建的表的字段名称为 order。 有没有办法更改查询构建器以确保字段名称包含在`(撇号)中 我的查询如下: $select = $this->select(
我的类(由 Zend_Db_Table_Abstract 扩展)有问题,每次使用连接和选择时它只返回一行.... 我在互联网上搜索过,但我没有找到任何关于这个“错误”的信息! class Api_Mo
基本问题如何从表映射器中获取“类型”列作为整数值? 我有一个运行网站的 PHP Zend Framework 1.12 应用程序。 MySQL 内部有多个包含多个列的表。在两个表中我使用了 SET 类
我是一名优秀的程序员,十分优秀!