Ниже рассмотрим простой, но имхо нужный пример по реализации аналога timestampable в Doctrine2.
doctrine
There are 12 posts tagged doctrine (this is page 1 of 2).
MySQL оптимизация: ORDER BY RAND()
Лирическое вступление:
Довольно часто у нас возникает потребность выборки случайных данных из mysql базы данных. Как правило времени нет и используется самая простая конструкция вида SELECT [что-то] FROM [где-то] WHERE [то и сё] ORDER BY RAND(). Эта конструкция работает на ура. Но вот прототип выезжает на продуктовые сервера и такой милый сердцу запрос вдруг начинает выпадать в топы медленных логов. Ниже будут рассмотрены несколько возможностей для оптимизации этого запроса по нарастанию их эффективности:
Doctrine forms – редактирование i18n контента
Данная заметка не открывает ничего нового, тем не менее, подобные вопросы постоянно возникают, в том числе и у меня.
Symfony snippet: partial для постраничной навигации (pagination)
Предлагаю вашему вниманию небольшой сниппет для повседневного применения в symfony 1.3 – 1.4.
Сниппет предназначен для отображения постраничной навигации по записям.
Сниппет: инициализация character_set и collation для Doctrine в Symfony
Для того чтобы Doctrine создавал таблицы в базе данных с правильным набором символов и collation (например utf8 и utf8_general_ci, а не latin1, используемый mysql по умолчанию (например)) необходимо выполнить простую инициализацию:
// config/ProjectConfiguration.class.php: public function configureDoctrine(Doctrine_Manager $manager) { $manager->setCharset( 'utf8' ); $manager->setCollate( 'utf8_unicode_ci' ); }
Спасибо Андрэю Дзягелю из русскоговорящего symfony-коммьюнити )
Магические числа и таблицы-справочники в Doctrine/Propel
Кросспост моего хабратопика.
Коль скоро у вас в проекте используется база данных, то вам рано или поздно потребуются справочные таблицы. Такие таблицы я бы условно разбил на три категории:
- Небольшие справочники, до 10, реже 20 записей. Например – таблица статусов чего-нибудь (active|inactive|deleted как минимум).
- Средние справочники – от 20 до нескольких сотен записей. Например, таблица типов или категорий чего-либо.
- Большие справочники – от нескольких сотен до сотен тысяч записей. Например список городов и улиц России.
Справочники, как правило, заполняются разово при создании и крайне редко пополняются. Но тем не менее, пополнение возможно и наиболее вероятно для третьего типа, менее для второго и редко для первого.
Собственно зачем я это пишу:
Вывод неэкранированных (unescaped) данных в symfony 1.3/1.4
Коль скоро в symfony 1.3/1.4 по умолчанию включено экранирование (escaping) всех выводимых данных, вам рано или поздно понадобится вывести что-либо в неэкранированном виде. Судя по постоянным вопросам в коммьюнити, не все могут найти документацию по этому вопросу, поэтому публикую эту небольшую заметку.
Doctrine + memcached: использование и тестирование
Doctrine ORM имеет встроенный кэш-менеджер, который умеет кэшировать в
- Memcached
- APC
- DataBase (видимо имеется в виду некая плоская БД с быстрым доступом, типа SQLite)
Узнав сей факт решил воспользоваться встроенным механизмом и протестировать механизм кэширования.
Continue reading
Ошибка в настройке sfDoctrineGuard – remember_me фильтр
Давно не работал sfGuard, и вот возникла такая необходимость. Поскольку используется Doctrine, поставил sfDoctrineGuard
. Пробежался по мануалу, настроил myUser
, доступные модули, пересобрал модель. Все как сказано в документации. Однако, после подключения фильтра remember_me, начались чудеса. Фронтэнд начал падать с ошибкой
500 | Internal Server Error | sfException Call to undefined method myUser::isAnonymous
Метод в наличии есть, myUser наследуется от sfGuardSecurityUser
. Все на месте. И тем не менее.
Ларчик конечно открывался довольно просто:
Оптимизация работы с Doctrine при помощи специализированных запросов
Если вы работаете над большим проектом на symfony + Doctrine и у вас много моделей и сложных запросов, вам обязательно потребуется способ, как хранить и использовать эти запросы, не теряя преимуществ ООП и более прямым способом, нежели традиционные способы addNamedQuery()
и createNamedQuery()
. Ниже приводится такой способ.