Обновить
8K+

Doctrine ORM *

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

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

Что будет, если убрать из ORM предположение «одна таблица — одна entity»?

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели9.2K

Большинство ORM строятся вокруг естественного предположения: одной таблице соответствует одна entity. Это настолько привычно, что даже не обращаешь внимания.

Это не правило, но вокруг него проектируются почти все остальные механизмы: метаданные принадлежат классу, Unit of Work отслеживает экземпляры этого класса, миграции собираются из его описания, а объектная модель постепенно начинает повторять структуру базы данных.

Но часто в коде не требуется вся таблица, многие поля служат только конкретным процессам и ни читать, ни менять эти поля в других процессах не требуется. В статье посмотрим два подхода работы с сущностями. А также к чему я пришёл, попробовав сделать по‑другому.

Читать далее

Новости

ORM — есть ли профит? Особенно когда по двору бегает ИИ-шка

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

ORM — Object-Relational Mapping — Объектно-реляционное отображение — это технология, позволяющая связывать SQL-ые БД с ООП кодом. Самая известная из них — Hibernate.

Hibernate — очень красивая технология. Она формирует ощущение магии.

Ты просто создаёшь объект, — хлабысь! — он уже в базе данных. Никакого SQL, никаких соединений, никаких ResultSet. Всё происходит как будто само собой. Прелесть.

Именно поэтому отказаться от Hibernate так тяжело.

Это напоминает Кольцо Всевластия из «Властелина колец». Оно не просто давало силу — оно меняло сознание своего владельца. Оно внушало мысль, что без него уже нельзя. Что именно оно даёт власть и контроль.

Hibernate действует очень похоже. Он формирует ощущение, что именно он управляет данными. Что именно он связывает код с базой. Что без него всё развалится.

И ты начинаешь бояться.

Бояться, что без Hibernate придётся писать бесконечный SQL. Бояться, что потеряешь контроль над данными. Бояться, что любая операция с базой превратится в мучение.

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

Читать далее

EAV Bundle

Уровень сложностиСредний
Время на прочтение1 мин
Охват и читатели7.2K

Искал реализацию EAV (Entity-Attribute-Value) паттерна на PHP или Symfony и не нашел. Типичная задача, но, на удивление, нет таких библиотек. Решил сделать свою [EAV bundle](https://github.com/maxkain/eav-bundle). Есть достаточно подробная документация...

Читать далее

Мне не нужен ORM, я могу просто использовать SQL

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели35K

Команда Spring АйО в новом переводе разобрала популярный аргумент «я просто использую SQL» и объяснила, почему Hibernate — это не замена, а дополнение к нативным запросам. А ещё — когда ORM действительно необходим, а когда можно без него обойтись.

Читать далее

Кодогенерация моделей и миграций в Laravel

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

Да, вместо того, чтобы ручками писать все эти скрипты миграций и в особенности классы моделей их лучше просто генерить в одно мгновение, а ни сидеть, копипастить туда‑сюда названия полей и т. п. Называется всё это термином database reverse engineering, который, как и технология судя по всему не очень то прижился, а совершенно напрасно. Под reverse engineering'ом обычно понимается генерация моделей/сущностей на основе таблиц БД. Но для Laravel есть ещё и кодогенераторы миграций.

Вообще, насколько я помню, и у Doctrine когда‑то был подобный функционал, но судя по этой записи либо его уже нет, либо он куда‑то мигрировал в Symfony. Если вы что‑то знаете о судьбе этой фичи в Doctrine напишите пожалуйста в комментариях. Так же напишите как обстоят дела с кодогенераций в других фреймворках и языках программирования, посмотрим на реалии.

Читать далее

Гайд по настройке Wt::Dbo и Visual Studio С++ для работы на Windows

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели2.2K

Я использую PostgreSQL 12-й версии! На остальных не проверял! Соответственно, он у вас должен быть скачан и настроен для использования.

Читать далее

Внедрение Doctrine ORM в Wordpress

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели3.9K

Статья про то, как можно весьма не сложно внедрить Doctrine ORM в ядро CMS Wordpress без потери производительности. Все вопросы и утверждения по типу: «А зачем», «А почему», «Да это только наложит дополнительный оверхэд и ничего с этого не выйграешь», возможно, будут проигнорированы:)

Читать далее

Асинхронный SQLAlchemy 2: простой пошаговый гайд по настройке, моделям, связям и миграциям с использованием Alembic

Время на прочтение30 мин
Охват и читатели126K

Наконец-то пришло время взяться за то, что я давно планировал — подробный гайд по асинхронной версии SQLAlchemy 2.0 в стиле ORM. В этой серии статей я подробно расскажу обо всех аспектах: от создания моделей и установления связей между ними до миграций с Alembic и взаимодействия с данными в базе. Мы будем шаг за шагом разбирать ключевые моменты работы с асинхронной базой данных, что позволит вам глубже понять SQLAlchemy и применить эти знания на практике.

Для начала, давайте разберёмся, что такое SQLAlchemy и почему каждый разработчик, работающий с реляционными базами данных (такими как SQLite, PostgreSQL, MySQL и т. д.), должен знать о ней. После этого — настройка. Мы будем работать с PostgreSQL, но не переживайте: код, который мы напишем, универсален для всех реляционных баз данных. Мы начнем с базовой настройки SQLAlchemy для асинхронного взаимодействия, а затем перейдём к созданию таблиц в современном декларативном стиле.

Читать далее

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

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

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

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

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

Читать далее

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

Время на прочтение20 мин
Охват и читатели16K

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

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

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

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

Читать далее

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

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

Время на прочтение13 мин
Охват и читатели6.5K

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

Поехали!

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

Время на прочтение3 мин
Охват и читатели25K

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

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

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

Читать далее

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

Время на прочтение14 мин
Охват и читатели20K

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, сериализация и десериализация

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

Читать далее

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

Время на прочтение4 мин
Охват и читатели15K

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

Читать далее

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

Время на прочтение9 мин
Охват и читатели6.8K

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

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

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

Читать далее

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

Время на прочтение11 мин
Охват и читатели5.2K

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

Читать дальше →