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

Doctrine ORM *

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

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

MyBatis «на минималках»

Уровень сложностиПростой
Время на прочтение11 мин
Количество просмотров7K

Привет, Хабр! Меня зовут Пётр Гусаров, я Java‑программист в CDEK. В этой статье расскажу про не очень распространённый фреймворк MyBatis.

Почему MyBatis? Потому что мы в CDEK используем его в большинстве проектов, и в деле он весьма неплохо себя показал. Немного сложен и непривычен на этапе входа, но все эти минусы перекрываются его гибкостью. «Да есть Hibernate, Jooq, JDBC и еще что‑то», — скажут бывалые. Есть, но в данной статье речь пойдёт о MyBatis.

Статья будет полезна новичкам, которые хотели попробовать данный фреймворк или попробовали, но что‑то не получилось.

Читать далее
Всего голосов 50: ↑49 и ↓1+52
Комментарии23

Новости

Использование Symfony / PHP (II)

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров5.9K

Привет! Я, Андрей, Symfony разработчик - мы делаем сайты. Каждый день мы тратим много ресурсов на администрирование и базовые настройки проектов. В этой статье я продолжаю делиться опытом, как можно адаптировать фреймворк Symfony под свои нужды. Сегодня я расскажу как мы работаем с базой данных и Doctrine. Поехали

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

Вы вообще нормальн… нормализованный??

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров5.1K

Сказ о том, нормализация данных завела производительность many-to-many в postgres в тупик, как это зло было повержено, и как тут нам помог Clickhouse.

Порой бывают ситуации, когда стоит посмотреть на задачу будто с нуля и отбросить предыдущий опыт и best practices. Подумать на несколько шагов вперёд. И лучше до того, когда уже вышли из SLA или нахватали негатива от клиентов или бизнеса. Об одной такой задаче и стандартном решении, которое пришлось больно редизайнить, хочется и поделиться с сообществом в этой статье.

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

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

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров4.9K

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

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

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

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

Время на прочтение20 мин
Количество просмотров8.8K

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

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

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

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

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

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

Время на прочтение13 мин
Количество просмотров4.9K

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

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

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

Время на прочтение3 мин
Количество просмотров14K

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

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

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

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

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

Время на прочтение14 мин
Количество просмотров11K

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 мин
Количество просмотров9.5K

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

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

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

Время на прочтение9 мин
Количество просмотров5K

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

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

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

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

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

Время на прочтение11 мин
Количество просмотров4.5K

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

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

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

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


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

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

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

Время на прочтение9 мин
Количество просмотров3.3K

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

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

Курсоры БД в Doctrine

Время на прочтение6 мин
Количество просмотров14K

image


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

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

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

Время на прочтение8 мин
Количество просмотров34K

Введение


Итак, начнем! Что же означает аннотация 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

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


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


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


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

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

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

Время на прочтение6 мин
Количество просмотров22K

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


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

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

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

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

Время на прочтение19 мин
Количество просмотров57K

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

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

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

Время на прочтение15 мин
Количество просмотров19K


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

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


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

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

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