#php #database #zend-framework #zend-db
#php #База данных #zend-framework #zend-db
Вопрос:
Я пытаюсь получить доступ к строкам вызова fetchAll (возвращает Zend_Db_Table_Rowset_Abstract) по первичному ключу строки.
Мне было интересно, что было бы самым простым способом сделать это, помимо перебора и поиска нужной строки.
Ответ №1:
Если я правильно помню, Zend_Db_Table_Rowset_Abstract
просто передается массив (или что-то похожее на него), затем, когда вы перебираете его, он создает Zend_Db_Table_Row_Abstract
объекты.
Лучшим способом может быть перебор один раз и сохранение строк в массиве, индексируемом первичным ключом. Таким образом, вы выполняете один цикл, а затем можете получить доступ к любой строке по ключу.
Обновление: просто взглянул на источник, вот данные, которые (в конечном итоге) передаются в объект набора строк:
$stmt = $this->_db->query($select);
$data = $stmt->fetchAll(Zend_Db::FETCH_ASSOC);
return $data;
Когда вы выполняете итерацию по набору строк в первый раз, этот исходный массив используется для создания объектов строк. Данные не были обработаны до этого момента, поэтому вы не делаете то, что уже было сделано.
Итак, вам нужно сделать что-то подобное, чтобы сопоставить строки с первичным ключом (я некоторое время не использовал Zend_Db_*
, рассматривайте это как псевдокод):
$rows = array();
foreach($rowset as $row){
//you could pull the primary key from Zend_Db_Table
$rows[$row->id] = $row;
}
//now you can lookup by primary key
$rows[55]->name;
Конечно, вы можете расширить абстрактный класс набора строк и сделать это внутренне, если хотите.
Комментарии:
1. Спасибо, я боялся делать слишком много циклов, но не думал об этом.
2. @Gootik, если вы делаете это часто (или во многих разных местах), вам, вероятно, следует расширить класс набора строк, чтобы сделать доступ прозрачным.
Ответ №2:
Используйте ‘$db->find($id)-> current();’
Надеюсь, это поможет.
Комментарии:
1. Это будет попадать в базу данных каждый раз, когда он обращается к строке, поскольку он использует
fetchAll
, я думаю, справедливо предположить, что он хочет получить большой набор данных для работы (а не отдельные строки). Он просто хочет получить доступ к этим извлеченным строкам по первичному ключу.2. Я понимаю. Итак, с помощью предоставленного вами кода мы можем получить доступ к строке типа: ‘$row = $data [$ id];’ Я прав?
3. Нет, этот код является внутренним
Zend_Db_Table_Abstract
— он просто показывает, что$data
(который передаетсяZend_Db_Rowset_Abstract
конструктору) является просто результирующим массивом из драйвера БД (индекс не является первичным ключом). Невозможно сопоставить первичный ключ со строкой, если вы не выполните итерацию по ней — следует отметить, что внутренний код не делает ничего подобного для вас, так что это не дублирующее усилие, если вы делаете это в своем коде.4. Тим прав, это огромный набор данных, и я просто хочу получить их все сразу и поработать с ними позже, вместо того, чтобы выполнять вызовы данных для каждой строки.