Download the PHP package dihalt/populator without Composer
On this page you can find all versions of the php package dihalt/populator. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Informations about the package populator
Populator
Proof of concept смешанной гидрации данных для Eloquent
Содержание
- Идея
- Особенности
- Ограничения
- Установка
- Использование
- Пример бэкенд
- Пример фронтенд
- Особенности ввода
- Плоские сущности
- HasOne
- HasMany
- BelongsTo
- BelongsToMany
- Особенности вывода
Идея
Работая с данными по API, мы часто получаем эти сущности с вложенными отношениями, но вот при отправке данных, вложенные отношения приходится обрабатывать вручную. Данный гидратор позволяет не думать об этом. И это сильно ускоряет разработку.
Особенности
- Позволяет работать с вводом и выводом моделей Eloquent "как есть" - без лишних манипуляций
- Unit of work - или будут выполнены все изменения, или (в случае ошибки) изменения не будут выполнены вообще
- Idenity map - гарантирует, что сущности одного типа и с одинаковым идетификатором - есть суть одно
- uuid - позволяет создавать валидные сущности и связывать их между собой по идентификатору, не обращаясь к базе данных
Ограничения
- На данный момент работает только с uuid
Установка
Использование
Использовать эту штуку очень просто
🔝
Пример бэкенд
🔝
Пример фронтенд
(не делайте так - это просто пример)
🔝
Особенности ввода
Плоские сущности
Возьмем простой пример:
Так как в переданных данных отсутствует поле id
(или другое поле, которе было укзано в $primaryKey
модели), гидратор создаст новую сущность. И наполнит ее передаными данными используя стандартный метод fill
.
В этом случае для модели будет сразу же сгенерирован id
.
Пример с идентификатором:
В этом примере id
был передан - поэтому гидратор попытается найти такую сущность в базе данных. Однако, если у него не получится найти такую запись в базе данных, то он создаст новую сущность с переданным id
.
В любом случае, гидратор заполнит эту модель переданными email
и name
. В этом случае, поведение похоже на User::findORNew($id)
.
🔝
HasOne
В данном случае, гидратор поступит с сущностью перового уровня (пользователем) так же, как в примере с идентификатором. Затем, он попытается найти и аккаунт - если не найдет (а в текущем примере у аккаунта нет id
), то создаст новый. Если найдет но с другим идентификатором, то заместит его вновь созданным. Старый же аккаунт будет удалён. Само собой в всязанное поле поста (например user_id
или author_id
- в зависимости от того, как это указано в отношении User::account()
), будет записан идентификатор пользователя.
🔝
HasMany
В примере с отношением, "многие к одному", гидратор поступит с каждой записью поста, как в примерере HasOne
. Кроме того, все записи, которые не были представлены в переданном массиве постов, будут удалены.
🔝
BelongsTo
Хотя этот пример и выглядит как HasOne
, работает он иначе. Если такая организация будет найдена гидратором в базе данных, то пользователь будет к ней привязан через поле отношения. С другой стороны, если такой записи не будет, то пользователь получит в это поле null
. Все прочие поля связанной записи (организации) будут проигнорированы - так как User
не является aggregate root
по отношению к Organization
, следовательно, нельзя управлять полями организации через объект пользователя, как нельзя и создать новые организации.
🔝
BelongsToMany
Этот пример похож на смесь из HasMany
(в том смысле, что все непредставленные записи будут удалены из пивота) и BlongsTo
(все поля, кроме поля $primaryKey
будут проигнорированы, по причинам изложеным выше в разделе belongsTo
). Обратите внимание, что работа с пивотом так же доступна.
Всё описанное работает рекурсивно, и справедливо для любой степени вложенности.
🔝
Особенности вывода
Стоит также отметить, что все переданные отношения будут добавлены в сущности при выводе. Например:
🔝
TODO
- добавить возможность персиста сущности не прошедшей через гидратор
- добавить в readme описание полиморфных отношений
🔝
All versions of populator with dependencies
illuminate/database Version ^10.0
illuminate/support Version ^10.0
ramsey/uuid Version ^4.1.1