是否可以使用db adapter而不是Zend_Db_Table来获取Zend_Db_Table_Row对象?
例如,我有一个下一个方法
public function isAllowed($ip = null)
{
$check = $this->_dbTable->fetchRow(
$this->_dbTable->select()
->from($this->_dbTable->getName(), array('id'))
->where('ip = ?', $ip)
);
var_dump($check);
}
如果我使用Zend_Db_Table,我会在这里获得Zend_Db_Table_Row对象,但我必须使用db adapter对象(因为使用主从复制),所以我有这样的东西
public function isAllowed($ip = null)
{
$db = My_Db_ConnectionManager::getConnection('slave');
$check = $db->fetchRow($db->select()
->from($this->_dbTable->getName(), array('id'))
->where('ip = ?', $ip)
);
var_dump($check);
}
在这里我得到一个数组,我怎么能在这里得到Zend_Db_Table_Row?
感谢。
答案 0 :(得分:2)
与DbTable相比,DbAdapter是与数据库的低级交互,因此您无法直接获取Table_Row(因为Table_Row需要更多DbAdapter未知的数据)。
您可以在获取结果后创建一个新的Table_Row对象(但这是从Zend_Db_Table_Abstract代码中获取并改编的):
$data = array(
'table' => $this->_dbTable,
'data' => $check,
'readOnly' => false,
'stored' => true
);
$row = new Zend_Db_Table_Row($data);
参见Zend / Db / Table / Abstract.php,如1373。
答案 1 :(得分:2)
您可以使用new
直接实例化Row对象,并将构造函数传递给构造函数以填充它。您可以从使用Adapter类运行的自定义查询中获取该数据。
但是你还需要传递对表的引用,因此该行知道数组的键是否对应于给定表的列。
在Zend_Db_Table_Row: Why do I have to use createRow()?
中查看我的回答另一种解决方案是使用Table类来获取行,但是指定db adapter:
public function isAllowed($ip = null)
{
$slaveDb = My_Db_ConnectionManager::getConnection('slave');
$masterDb = $this->_dbTable->getAdapter();
$this->_dbTable->setOptions(array('db'=>$slaveDb));
$check = $this->_dbTable->fetchRow(
$this->_dbTable->select()
->from($this->_dbTable->getName(), array('id'))
->where('ip = ?', $ip)
);
$this->_dbTable->setOptions(array('db'=>$masterDb));
var_dump($check);
}