Как стать автором
Обновить
3.5

Doctrine ORM *

Объектно-реляционный проектор (ORM) для PHP

Сначала показывать
Порог рейтинга
Уровень сложности

Разрабатываем свою ORM библиотеку на Rust: Оптимизация и Простота

Уровень сложности Простой
Время на прочтение 3 мин
Количество просмотров 2.5K
Doctrine ORM *Rust *
Мнение

Почему я решил разработать свою ORM библиотеку?

Мои первые шаги в мире ORM были сделаны с помощью библиотеки Diesel. В то время он был одним из немногих вариантов для работы с базами данных на Rust, и, конечно же, его популярность не оставила меня равнодушным. Вскоре, однако, я обратил внимание на SeaORM - другую перспективную библиотеку для ORM на Rust, которая также набирала обороты. Но у меня были с ними некоторые проблемы.

Читать далее
Всего голосов 9: ↑8 и ↓1 +7
Комментарии 7

Новости

Оптимизация бэкенда приложения с примерами на Symfony. Часть 2

Время на прочтение 20 мин
Количество просмотров 5.1K
Разработка веб-сайтов *PHP *Symfony *Doctrine ORM *

Всех приветствую!

Это продолжение серии статей, где мы рассмотрим еще несколько методов, которые помогут улучшить производительность приложения. Мы поговорим о том, как использовать entity manager, unit of work, bulk inserts и batching processing для более эффективной работы с базой данных.

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

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

Читать далее
Всего голосов 13: ↑11 и ↓2 +9
Комментарии 9

Оптимизация OneToMany коллекций Doctrine

Время на прочтение 13 мин
Количество просмотров 3.7K
PHP *Программирование *Symfony *Doctrine ORM *

В этой статье будет показан пример того, как уменьшить количество запросов к базе данных до одного при работе с коллекциями сущностей иерархической структуры в контексте PHP и Doctrine ORM. Полный пример решения вы можете посмотреть в специальном репозитории. Статья основана на решении проблемы из обсуждения на StackOverflow.

Поехали!
Всего голосов 12: ↑12 и ↓0 +12
Комментарии 9

Работа с Веб-сокетами на PHP

Время на прочтение 3 мин
Количество просмотров 9.8K
PHP *Symfony *Doctrine ORM *
Из песочницы

PHP - едва ли первое, что придет в голову, когда стоит задача поднять сервер веб-сокетов. Практически каждая статья в интернете будет пестрить предложениями использовать для этого NodeJS, Python или Go. Но поскольку PHP - это однозначно первое, что приходит в голову, когда речь идет о веб-приложениях, почему бы не попробовать?

На самом деле, запуск сервера веб-сокетов на PHP довольно прост. Существует превосходная библиотека Ratchet, позволяющая работать на любом фреймворке (или вовсе без него) полноценно и легко.

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

Читать далее
Всего голосов 17: ↑10 и ↓7 +3
Комментарии 20

Истории

API platform по быстрому

Время на прочтение 14 мин
Количество просмотров 6.2K
PHP *Symfony *Doctrine ORM *API *
Туториал

API platform это полнофункциональный REST API, который вы получите за считанные минуты. Вот неполный список фич:

- Генерация CRUD

- Поддержка GraphQL

- Машиночитаемая документация API в форматах Hydra и Swagger/Open API, гененрится из метаданных PHPDoc, Serializer, Validator и Doctrine ORM / MongoDB ODM

- Хорошая удобочитаемая документация, созданная с использованием пользовательского интерфейса Swagger (включая песочницу) и / или ReDoc

- Пагинация

- Куча фильтров

- Проверка с использованием компонента Symfony Validator (с поддержкой групп)

- Расширенные правила аутентификации и авторизации

- Расширенная сериализация благодаря компоненту Symfony Serializer (поддержка групп, встраивание отношений, максимальная глубина...)

- Поддержка JWT и OAuth- Файлы и \DateTime, сериализация и десериализация

- Все полностью настраивается благодаря мощной системе событий и сильному ООП.

Читать далее
Всего голосов 6: ↑4 и ↓2 +2
Комментарии 11

PHP: атрибуты vs аннотации: оптимизируем метадату Doctrine

Время на прочтение 4 мин
Количество просмотров 6.4K
PHP *Doctrine ORM *

Одним из нововведений PHP 8.0 являются атрибуты. Атрибуты содержат метадату для классов, полей, функций; которая доступна через Reflection API. Казалось бы, то же самое, что и аннотации, тогда зачем обращать внимание на эту фичу?

Читать далее
Всего голосов 16: ↑16 и ↓0 +16
Комментарии 5

Оптимистическая блокировка коллекций Агрегата при использовании Doctrine

Время на прочтение 9 мин
Количество просмотров 4K
PHP *Symfony *Doctrine ORM *
Из песочницы

Проектирование своего проекта по DDD последнее время становится всё более популярным. Сейчас не будем углубляться в данную методологию с её принципами, плюсами и минусами. Я хочу рассказать с какой проблемой столкнулась наша команда при использовании данной методологии на PHP, а именно внедрении Data Mapper’а Doctrine ORM.

Чтобы более понятно донести нашу проблему я буду использовать известный всем Агрегат Заказа (Order) и позиции заказа (OrderLine), которые являются коллекциями Dortrine ORM. Так же сильно упростим данный агрегат, чтобы фокусироваться на самой проблеме. И так начинаем!

Для начала мы создадим наш агрегат заказа.

Читать далее
Всего голосов 10: ↑10 и ↓0 +10
Комментарии 11

Пара слов о спецификациях

Время на прочтение 11 мин
Количество просмотров 4.2K
PHP *Symfony *Doctrine ORM *Usability *

Всем доброго времени суток! Удивительно, но упоминание о шаблоне "Спецификация" в контексте php встречается крайне редко. А ведь с его помощью можно не только избежать комбинаторного взрыва методов репозитория, но и улучшить переиспользование кода. Я же в свою очередь хотел бы остановиться на еще одной возможности, предоставляемой данным паттерном. С ее помощью можно решить проблему, которая возникает почти в каждом веб-приложении. И лично мне очень не хватало этого знания еще пару лет назад.

Читать дальше →
Всего голосов 11: ↑8 и ↓3 +5
Комментарии 14

Doctrine ResultSetMapping на примерах

Время на прочтение 8 мин
Количество просмотров 18K
PHP *Doctrine ORM *
Из песочницы
Doctrine ORM предоставляет разработчику удобные средства выборки данных. Это и мощный DQL для работы в объектно-ориентированном ключе, и удобный Query Builder, простой и понятный в использовании. Они покрывают большую часть потребностей, но иногда возникает необходимость использовать SQL запросы, оптимизированные или специфичные для конкретной СУБД. Для работы с результатами запросов в коде важно понимание того, как работает маппинг в Doctrine.


Читать дальше →
Всего голосов 18: ↑18 и ↓0 +18
Комментарии 4

Проблемы использования Doctrine ODM в процессах-демонах

Время на прочтение 9 мин
Количество просмотров 2.9K
PHP *Doctrine ORM *
Из песочницы

Хочу рассказать о своем опыте использования Doctrine ODM в относительно небольшом PHP проекте, в котором основная кодовая база сосредоточена в процессах-демонах. И вообще как мы к Yii2 прикрутили Doctrine ODM. Сразу предупреждаю — рассказ будет очень нудным и скорее всего интересен только тем, кто уже сталкивался с проблемами при работе с Doctrine ODM в процессах-демонах.

Читать дальше →
Всего голосов 16: ↑16 и ↓0 +16
Комментарии 15

Курсоры БД в Doctrine

Время на прочтение 6 мин
Количество просмотров 13K
Блог компании Lamoda Tech PHP *PostgreSQL *Symfony *Doctrine ORM *

image


Используя курсоры, вы сможете порционно получить из БД и обработать большое количество данных, не расходуя при этом память приложения. Уверен, перед каждым веб-разработчиком хотя бы раз вставала подобная задача, передо мной тоже — и не раз. В этой статье я расскажу, в каких задачах курсоры могут быть полезны, и дам готовый код по работе с ними из PHP + Doctrine на примере PostrgeSQL.

Читать дальше →
Всего голосов 34: ↑34 и ↓0 +34
Комментарии 22

Замечательная аннотация Version в JPA

Время на прочтение 8 мин
Количество просмотров 27K
Программирование *Java *Doctrine ORM *
Из песочницы

Введение


Итак, начнем! Что же означает аннотация Version в JPA?

Если коротко, то она отвечает за блокировки в JPA. Данная аннотация решает одну из проблем, которые могут возникнуть в результате параллельного выполнения транзакций.

Какие же могут возникнуть проблемы?


  1. Потерянные обновления могут возникнуть в ситуациях, когда две транзакции, выполняющиеся параллельно, пытаются обновить одни и те же данные.
  2. Грязные чтения возникают, когда транзакция видит еще не сохранённые изменения, сделанные другой транзакцией. В таких случая может возникнуть проблема из-за отката второй транзакции, но при этом данные уже были прочитаны первой.
  3. Неповторяемые чтения возникают, когда первая транзакция получила данные, а вторая транзакция внесла в них изменение и успешно закоммитила их, до окончания первой транзакции. Иначе говоря, когда в рамках одной транзакции один и тот же запрос на получение, например всей таблицы, возвращает разные результаты.
  4. Фантомное чтение — проблема похожая на неповторяемые чтения, за тем исключением, что возвращается разное количество строк.

Коротко о их решениях


  1. READ UNCOMMITED — решается с помощью аннотации Version в JPA(об этом как раз и статья)
  2. READ COMMITED — позволяет читать только закоммиченные изменения
  3. REPEATABLE READ — тут немного посложнее. Наша транзакция «не видит» изменения данных, которые были ею ранее прочитаны, а другие транзакции не могут изменять тех данных, что попали в нашу транзакцию.
  4. SERIALIZABLE — последовательное выполнение транзакций

Каждый последующий пункт покрывает все предыдущие, иначе говоря может заменить решения, указанные ранее. Таким образом SERIALIZABLE имеет самый высокий уровень изолированности, а READ UNCOMMITED — самый низкий.
Читать дальше →
Всего голосов 8: ↑8 и ↓0 +8
Комментарии 4

Ближайшие события

Реализация стейтмашины на Zend Framework3+Doctine2

Время на прочтение 5 мин
Количество просмотров 1.9K
Zend Framework *Doctrine ORM *
Из песочницы

Введение: зачем нужна стейтмашина


В приложениях часто необходимо ограничивать доступ к тем или иным действиям над объектом. Для этого используют RBAC-модули, которые решают задачу ограничения доступа в зависимости от прав пользователя. Остается нерешенной задача управления действиями в зависимости от состояния объекта. Эта задача хорошо решается с помощью конечного автомата или state machine. Удобная стейтмашина позволяет не только собрать в одном месте все правила переходов между состояниями объекта, но и наводит некоторый порядок в коде отделяя правила переходов, проверки условия и обрабочкики и подчиняя их общим правилам.


Хочу поделиться реализацией стейтмашины под Zend Framework 3 с использованием Doctrine 2
для работы с базой данных. Сам проект можно найти по ссылке.


А здесь я хочу поделиться основными заложенными принципами.

Читать дальше →
Всего голосов 4: ↑4 и ↓0 +4
Комментарии 14

Использование событийной модели в Doctrine 2 + Symfony 3

Время на прочтение 6 мин
Количество просмотров 21K
PHP *Symfony *Doctrine ORM *

Давайте представим ситуацию: у вас есть заказ в интернет магазине (Entity). Заказ имеет некий статус. При смене статуса заказа необходимо провести кучу сопутствующих действий, например:


  • сохранить в заказе дату последнего изменения
  • записать в историю по заказу информацию о смене статуса
  • отослать письмо / sms клиенту
  • вызвать метод API службы доставки / платежной системы / партнера и т.д.

Возникает вопрос как все это правильно организовать с точки зрения программного кода.
Все ниже описанное справедливо для Doctrine 2 и Symfony > 3.1

Читать дальше →
Всего голосов 7: ↑6 и ↓1 +5
Комментарии 52

DDD на практике. Проектирование списка желаний

Время на прочтение 19 мин
Количество просмотров 54K
PHP *Symfony *Проектирование и рефакторинг *Doctrine ORM *ООП *
Туториал

В интернете довольно много разрозненного материала по DDD. Если не считать синей книги, то в основном это короткие статьи с теорией, надёрганной из этой же книги, и которая мало пересекается с практикой. Возможно, конечно, что я просто плохо искал, но мне давно хотелось найти какой-нибудь цельный пример, что называется, «от и до». И я решил такой пример создать на Symfony 3 и VueJS. Сразу хочу сказать, что я изучаю DDD недавно, поэтому взял довольно простую предметную область — список желаний (wish list).

Читать дальше →
Всего голосов 17: ↑14 и ↓3 +11
Комментарии 56

Джентльменский набор Doctrine 2 для Symfony 3.3.6: Создание сущности, ассоциации и рекурсивные связи

Время на прочтение 15 мин
Количество просмотров 18K
PHP *Symfony *Doctrine ORM *
Туториал


Доброго дня, читатель!

Что мы будем делать с вами по ходу чтения статьи


  • Создадим простые сущности
  • Немного поговорим об ORM аннотациях
  • Реализуем ассоциации:
    1. Двунаправленные связи Один к Одному
    2. Двунаправленные связи Один ко Многим
    3. Двунаправленные связи Многие ко Многим
    4. Рекурсивные связи

  • Поиграемся этими сущностями с помощью фикстур

Читать дальше →
Рейтинг 0
Комментарии 8

Doctrine Specification Pattern или ваш реюзабельный QueryBuilder

Время на прочтение 5 мин
Количество просмотров 17K
PHP *Symfony *Doctrine ORM *
Туториал
Я постараюсь максимально коротко рассказать о том, как можно использовать этот паттерн с нашей любимой Doctrine на примерах и почему так делать — true.

Давайте представим себе базовый кейс:

  1. У нас есть: сущность «Дом», сущность «Квартира в доме», сущность «Застройщик», сущность «Регион».
  2. У нас есть задача: иметь возможность получить всех застройщиков, иметь возможность получить все занятые регионы застройщиком, уметь возможность получить все дома, которые принадлежат застройщику и все доступные регионы вообще в принципе, где ведутся продажи домов.
  3. У нас есть правила от бизнеса:
Читать дальше →
Всего голосов 15: ↑15 и ↓0 +15
Комментарии 90

ЧПУ (SEF URLs) в Symfony 3 — автогенерация slug, настройка и маршрутизация

Время на прочтение 10 мин
Количество просмотров 11K
PHP *Symfony *Doctrine ORM *
Туториал
Всем доброго времени суток!

Третьего дня мне понадобилось провести блиц вебинар на тему ЧПУ в Symfony. Вообще время вебинара у меня ограничено двумя часами, при этом я должен был рассказать еще и про автогенерацию CRUD функционала (scaffolding) в той же Symfony, и про простейший способ создать постраничность. Это создало проблему, так как я знаю как сделать ЧПУ «ручками», не прибегая к автоматизированным под эту задачу инструментам, но рассказ получился бы долгий и оказались бы затянутыми в обсуждение лишние темы. Поэтому я пошел спрашивать у Интернета как сделать все проще. И вот я оказался в той редкой ситуации, когда такая популярная платформа как Symfony не имеет банального обучающего материала на тему «ЧПУ в три клика». Смотрел так же и на английском языке, но там тоже пусто (может плохо искал — время было ограничено). В общем я справился с поиском разрозненного материала по данной теме, а так же со сбором его в единое повествование, так что почему бы не поделиться со всеми?


Читать дальше →
Всего голосов 8: ↑7 и ↓1 +6
Комментарии 19

ORM на php для MySQL, реальность (часть первая)

Время на прочтение 8 мин
Количество просмотров 34K
PHP *MySQL *Doctrine ORM *
Из песочницы
После долгих поисков интересующей меня библиотеки на php для связи с MySQL сел и написал свою, наиболее подходящую для использования в проектах. Данная тема займет небольшой цикл статей, который будет полезен не только профессиональным разработчикам веб-приложений, но и начинающим. Следует отметить, что представленная ниже ORM библиотека, которую, кстати, я назвал kitty, является результатом долгих мучений и не является обязательной библиотекой всех проектов.

Библиотека по моему видению должна иметь два файла (по крайней мере на начальных этапах):
  • файл библиотеки — kitty.php;
  • файл объектного изображения модели базы данных — modeldb.php.

Читать дальше →
Всего голосов 39: ↑10 и ↓29 -19
Комментарии 62

Вклад авторов