Как установить гидратор по умолчанию в Doctrine? - PullRequest
3 голосов
/ 14 января 2010

Я не могу найти способ установить гидратор по умолчанию в Doctrine. Это должно быть доступно. Правильно?

http://docs.doctrine -project.org / проекты / doctrine1 / о / последний / ы / ручной / данные hydrators.html # писание-гидратация-метод

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

Ответы [ 2 ]

2 голосов
/ 25 августа 2010

Я понял это, прочитав комментарий Криса Гутьерреса и изменив некоторые вещи.

Сначала определите класс расширения для 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;
    }
}
0 голосов
/ 21 января 2010

Это была бы отличная идея, и, прочитав ваш вопрос, я подумал, что вы могли бы сделать это с помощью Доктрины.Однако чтение кода заставляет меня думать, что вы не можете:

Doctrine_Query::create() создает новый запрос, определяющий только первый аргумент Doctrine_Query_Abstract::__construct(), соединение, без указания второго аргумента - режима гидратации.Не обращаются к настройке.Так как гидратор не передается, создается новый Doctrine_Hydrator, и его конструктор одинаково нигде не ищет параметр конфигурации, и поэтому он имеет настройку по умолчанию Doctrine::HYDRATE_RECORD.

Возможно создание подкласса Doctrine_Query с помощью приведенного нижеЗаводской метод самый простой вариант?

public static function create($conn = null)
{
    return new Doctrine_Query($conn,Doctrine::HYDRATE_ARRAY);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...