Как получить объект Row в ZF, используя адаптер для запроса? - PullRequest
1 голос
/ 20 декабря 2011

Можно ли получить объект Zend_Db_Table_Row, используя для извлечения вместо Zend_Db_Table адаптер db?

Например, у меня есть следующий метод

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 IЯ получу объект Zend_Db_Table_Row здесь, но мне придется работать с объектом адаптера db (из-за использования репликации master-slave), поэтому у меня есть что-то вроде

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 ]

2 голосов
/ 20 декабря 2011

Вы можете создать экземпляр объекта Row непосредственно с помощью new и передать конструктору массив данных, чтобы заполнить его. Вы можете получить эти данные из пользовательского запроса, который вы выполнили с помощью класса Adapter.

Но вам также нужно передать ссылку на таблицу, чтобы строка знала, соответствуют ли ключи вашего массива столбцам данной таблицы.

См. Мой ответ в Zend_Db_Table_Row: Почему я должен использовать createRow ()?

Другое решение - использовать класс Table для извлечения вашей строки, но указать адаптер db:

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);
}
2 голосов
/ 20 декабря 2011

DbAdapter - это низкоуровневое взаимодействие с базой данных по сравнению с DbTable, поэтому вы не можете напрямую получить 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.

...