С момента релиза предыдущей версии Propel прошло меньше месяца. Текущая версия Propel 1.5.2 имеет обратную совместимость с веткой 1.5. За это время было исправлено более чем 20 багов, добавлены новые фичи. Полный список изменений.
Список новых возможностей
Поддержка Namespace
Aggregate Column Behavior – позволяет повесить Behavior на изменение поля с помощью агрегатной функции
ModelCriteria::findOneOrCreate() – делается выборка данных используя findOne(), если результат пустой, то создается новая запись
Simple Templating Engine For Behaviors – создавать Behaviors стало проще
Query Comments – в выполняемый SQL запрос стало возможным добавлять комментарии, что очень полезно при анализе журналов выполненных запросов
Miscellaneous – рефакторинг автозагрузчика Model, чтобы разделить загрузку классов «Core Propel» и классов Model, что увеличит время загрузки и упрощает интеграцию со сторонними библиотеками
В новой версии плагина sfPropel15Plugin появилось два новых инструмента: sfFormPropel::embedRelation(), and sfFormPropel::mergeRelation(). Они позволяют добавлять, редактировать и удалять вложенные объекты на странице основного объекта. Детально с новой функциональностью можно ознакомиться просмотрев видео:
Бывают ситуации, когда нужно получить запрос c оператором Left Join указав несколько условных выражений. Например:
SELECT * FROM news
LEFT JOIN news_type ON news.type_id = news_type.id AND YEAR(news.published_at) = YEAR(NOW())
WHERE news.is_published = 1 AND ...
LIMIT 10
Цель: уменьшить количество запросов для таблиц использующих много внешних ключей.
Описание проблемы: имеем 4 таблицы: news, news_i18n, news_type и news_type_i18n. На странице нужно отобразить список из 20 новостей, используя все перечисленные таблицы. А это 21 запрос. Методы doSelectWithI18n и doSelectJoinAll не позволяют получить значения i18n NewsTypePeer для NewsPeer с минимальным количеством запросов к БД.
Решение проблемы: вместо 21 запроса к БД выполнить 2. Механизм – использовать предзагрузку объектов NewsTypePeer со значениями i18n.
sfPropelPager – это встроенная в Propel функциональность, которая позволяет организовать Пейджинг (Propel Pager), т.е. разбивку на страницы. Работает великолепно, ознакомиться подробнее можно в статье How to paginate a list. Описанные ниже действия проводились на Propel 1.3.
Принцип работы простой, сначала делается запрос на определение количества записей, а далее получаем данные с учетом количества их на странице. Например, имеем Propel ORM объекты News и NewsI18n. Читать дальше
В Symfony для Propel есть такая замечательная функциональность как Behaviors. Благодаря Behavior можно расширять существующие модели без необходимости изменять код самой модели. Фактически получает имитация «множественного» наследования. Зачем это надо? К примеру есть вот такой интересный плагин sfPropelActAsTaggableBehaviorPlugin – задумка прекрасная, сделать возможность добавлять теги для любых моделей. Чтобы активировать Behaviors нужно в propel.ini включить их. Читать дальше
В документации Propel можно увидеть таблицы соответствия между ним и типами столбцов MySQL (Propel Column Types). Проблема в том, что не все типы столбцов можно явно указать.
Если попытаться указать поле типа ENUM, то при генерировании SQL получим ошибку:
Cannot map unknown Propel type 'ENUM' ...
Cannot map unknown Propel type 'ENUM' to native database type ..
Похожая ситуация наблюдается и в следующем примере. Например, если в схеме указать нижеследующее, то получим ошибку на счет поля created_at ( Cannot map unknown Propel type ‘DATETIME’ to native database type ):
Это решение проблемы для Symfony 1.1 и Propel 1.3, когда нужно из двух таблиц объединенных черех join получить все данные. Т.е. хотим выполнить такой запрос
SELECT news.NEWS_ID, news.CATEGORY_ID, news.TITLE, news.BODY, news.CREATED_AT,
news_category.CATEGORY_ID, news_category.NAME
FROM `news`
LEFT JOIN news_category ON (news.CATEGORY_ID=news_category.CATEGORY_ID)
А вот с этим проблема, если таблицы не связаны через внешний ключ (foreign key), вывести данные из второй таблицы news_category проблематично, но возможно. В основе материал: Applying custom joins in doSelect* method. Но для новой версии материал не соответствует действительности. Чтобы все заработало, следует сделать следущее.
sfPropelPlugin это плагин для работы с Propel 1.3. Текущая версия 1.3.0 stable от 28/05/2008. Наткнулся на проблему при использовании виджета sfWidgetFormPropelSelect. Если указать порядок сортировки, то получаем ошибку на экран.
Комментариев нет