2015-12-07 32 views
0

我正在修复与Zend_Db_Table模型相关的错误。我面临的问题是,神不知鬼不觉被改变的Zend_Db_Table类祖先的$ _primary财产你打电话后插入,更新等Zend Framework 1.12:Zend表的_setupPrimaryKey方法

比方说,我在这个领域有以下值:

Class Model_Book extends App_Base_FileForAcs implements App_Interface_OnixDataSource, App_Interface_ApiDataSource, App_Interface_DbGateway 
{ 
protected $_name = 'book'; 
protected $_primary = 'book_id'; 
... 
} 

如果我检查插入操作之后$ _primary它将包含:

array(1) { 
[1]=> 
string(7) "book_id" 
} 

这一转变发生在Zend_Db_Table_Abstract类的_setupPrimaryKey方法。你能解释为什么这个字段应该转换为数组,并且为什么数组以非0索引开头?

回答

0

ZF内部使用数组来定义主键以管理复合键。它在这里描述:

http://framework.zend.com/manual/1.12/en/zend.db.table.html#zend.db.table.defining.primary-key

中的代码_setupPrimaryKey要么蒙上你的字符串数组索引1,或者如果它已经是一个数组,做一个array_unshift($this->_primary, null)随后通过取消_primary [0],使之1基。

要获得主键(作为一个数组),您可以在这里找到更多信息:Get Primary Key out of Zend_Db_Table_Rowset Object - 包括如何从表格对象中获取它。

因此,总之 - 主键始终是一个数组,但ZF允许您将其定义为字符串,以方便使用。你从来没有描述过你的bug,但是如果你依赖的主键是一个字符串,直接读取$ _primary,你应该重构使用$objZenDbTable->info('primary')来获得密钥,完全期待一个数组。

+0

谢谢你的回答。我的问题是,我期望像任何其他地方一样,数组以索引0开头。为什么ZF决定以1开始这个阵列 - 这有什么特别的原因吗? – Tamara

+0

不,我不确定他们为什么这样实施它。有一个函数试图从表元数据中找出主键,然后将索引设置为表定义中列的相对位置。还有一些PostgreSQL的特殊情况可能会以某种方式使用该索引。由于任何“硬编码”索引键索引在1像你说的,我不明白它会有什么不同。也许这是一些从未完成的工作?如果你想深入挖掘,你可以在'Zend \ Db \ Table \ Abstract.php'中找到围绕第872行的代码。 – Bing