如何使用适配器在ZF中获取Row对象?

时间:2011-12-20 13:43:34

标签: database zend-framework zend-db

是否可以使用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?

感谢。

2 个答案:

答案 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);
}