Doctrine2... Лучший режим гидратации?

Я проектирую систему бронирования номеров, которая имеет девять сущностей, которые все связаны друг с другом. В этом конкретном экземпляре я извлекаю 10-30 строк из объекта entry, который имеет 25 свойств. Каждая запись имеет один room, который имеет 10 свойств. Мне нужна вся информация о входе, а также entry->room->id и entry->room->name. Но кажется, что доктрина загружает весь room, когда я использую Query::HYDRATE_ARRAY. Кажется, что ленивая загрузка в Query::HYDRATE_OBJECT легче.

Итак, мне интересно, работает ли режим Query::HYDRATE_OBJECT быстрее или "лучше", чем Query::HYDRATE_ARRAY/Query::HYDRATE_SCALAR/Query::HYDRATE_SINGLE_SCALAR. Поскольку я повторно использую старый код, я бы хотел использовать HYDRATE_ARRAY, но только если он не замедлит приложение.

Ответ 1

Мои 2 цента:

HYDRATE_OBJECT лучше всего использовать, когда вы планируете использовать много бизнес-логики с вашими объектами. Особенно, если вы делаете много манипуляций с данными. Это также, вероятно, самый медленный (в зависимости от ситуации).

HYDRATE_ARRAY обычно резервируется, когда вам нужен только результат и 1 градус реляционных данных, и он будет использоваться только для целей печати и просмотра.

HYDRATE_NONE - это еще один, который я использую, когда я выбираю только очень небольшое подмножество данных (например, одно или два поля вместо целой строки). Это ведет себя так же, как результат необработанного запроса.

Это также может представлять интерес http://www.doctrine-project.org/2010/03/17/doctrine-performance-revisited.html

Это из 1.2 документов, но я думаю, что советы по гидратации применяются в 2.0 http://doctrine.readthedocs.org/en/latest/en/manual/improving-performance.html

Другим важным правилом, которое относится к этой категории, является: только извлекать объекты, когда они вам действительно нужны. У Doctrine есть возможность извлекать "графы массива" вместо графов объектов. На первый взгляд это может показаться странным, потому что зачем использовать объектно-реляционный картограф? Возьмите секунду, чтобы подумать об этом. PHP по своей природе является предшественником, который был расширен множеством функций для достойного ООП. Массивы по-прежнему являются наиболее эффективными структурами данных, которые вы можете использовать в PHP. Объекты имеют наибольшую ценность, когда они используются для выполнения сложной бизнес-логики. Это пустая трата ресурсов, когда данные обернуты в дорогостоящие структуры объектов, когда у вас нет выгоды от этого

При использовании HYDRATE_ARRAY:

Можете ли вы представить себе какую-либо выгоду от наличия объектов в представлении вместо массивов? Вы не собираетесь выполнять бизнес-логику в представлении, не так ли? Один параметр может сэкономить вам много ненужной обработки:

$blogPosts = $q->execute(array(1), Doctrine_Core::HYDRATE_ARRAY);