Я понял это, прочитав комментарий Криса Гутьерреса и изменив некоторые вещи.
Сначала определите класс расширения для Doctrine_Query. Расширьте конструктор, чтобы определить собственный режим гидратации.
class App_Doctrine_Query extends Doctrine_Query
{
public function __construct(Doctrine_Connection $connection = null,
Doctrine_Hydrator_Abstract $hydrator = null)
{
parent::__construct($connection, $hydrator);
if ($hydrator === null) {
$this->setHydrationMode(Doctrine::HYDRATE_ARRAY); // I use this one the most
}
}
}
Затем, в своей начальной загрузке, расскажите Doctrine о вашем новом классе.
Doctrine_Manager::getInstance()->setAttribute(Doctrine_Core::ATTR_QUERY_CLASS, 'App_Doctrine_Query');
Крис Гутьеррес определил атрибут для соединения вместо глобально, но у меня более одного соединения, и я хочу использовать это значение по умолчанию для всех из них.
Теперь вам не нужно вызывать Doctrine_Query :: setHydrationMode () каждый раз, когда вы создаете запрос.
Вот дополнительная информация
http://www.doctrine -project.org / проекты / ОРМ / 1,2 / Docs / ручной / конфигурации / EN # Configure-запроса класса
РЕДАКТИРОВАТЬ: изменения ниже
Я обнаружил проблему с вышеуказанным. В частности, выполнение чего-то вроде «Doctrine_Core :: getTable ('Model') -> find (1)» всегда будет возвращать гидратированный массив, а не объект. Поэтому я немного изменил это, определив пользовательские методы выполнения для использования в вызове Query.
Также я добавил код освобождения памяти.
class App_Doctrine_Query extends Doctrine_Query
{
public function rows($params = array(), $hydrationMode = null)
{
if ($hydrationMode === null)
$hydrationMode = Doctrine_Core::HYDRATE_ARRAY;
$results = parent::execute($params, $hydrationMode);
$this->free(true);
return $results;
}
public function row($params = array(), $hydrationMode = null)
{
if ($hydrationMode === null)
$hydrationMode = Doctrine_Core::HYDRATE_ARRAY;
$results = parent::fetchOne($params, $hydrationMode);
$this->free(true);
return $results;
}
}