Download the PHP package hindy/orm without Composer
On this page you can find all versions of the php package hindy/orm. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Informations about the package orm
Mindy ORM (Django like ORM)
Еще одна реализация Django ORM на PHP. На текущий момент находится в стадии активной доработки и не
рекомендуется к использованию в production
до версии 1.0.
Приносим извинения за неполноту документации. Документация находится разработке.
Часть кода основана на yii2 фреймворке, но ввиду монолитности ядра мы были вынуждены
"распилить" фреймворк по отдельным пакетам. В Mindy ORM
активно используется Query из yii2.
Поддерживаемые типы субд: sqlite
, mysql
, pgsql
, mssql
(все то, что умеет yii2 query).
Теоретически ORM способна работать с NoSql
хранилищами за счет реализации собственного менеджера
с переопределением Lookup
'ов.
Краткий пример возможностей ORM
Опишем подключение к бд:
Опишем модель:
Описание модели завершено. Валидация происходит на основе валидации полей модели. Модель описана, теперь необходимо создать ее в субд. Для этого выполним следующий код:
В бд создатутся таблицы всех переданных моделей а так же индексы и связи если это возможно.
Создадим несколько записей:
Выборки реализованы по аналогии с Django Framework:
И так далее. Более подробную информацию смотрите в разделе Lookups
Очистим базу данных:
Менеджеры
Менеджер это интерфейс проксирующий до класса QuerySet
, который занимается обработкой
наших Lookup
'ов и выполнением запросов. Каждая модель по умолчанию имеет менеджер objects()
.
Менеджер обрабатывает QuerySet. Основным методом менеджера является getQuerySet()
.
Это возвращает объект, который впоследствии обрабатывается менеджером.
Если вы хотите изменить логику менеджера по умолчанию, вы можете создать свой собственный менеджер.
Например, activeUsersManager()
:
Модель с собственным менеджером:
Теперь вы можете использовать ActiveUsersManager()
с помощью User::activeUsers()
.
И все запросы будут выполняться в соответствии с вашей логикой обработки только активных пользователей.
Например, этот код поможет выбрать активных пользователей имя которых начинается с 'A':
Manager/QuerySet методы
Methods returning a result
Get
Выборка одного объекта. В случае если объектов соответствующих условию больше 1, выбрасываем исключение, иначе возвращаем объект. Если объектов не найдено, то возвращаем null.
Найдем объект где pk == 5
.
All
Возвращает массив моделей класса Model
или ассоциативный массив в случае если
вызван метод asArray()
.
Выборка всех пользователей. Вернется массив моделей класса User
.
Выборка всех пользователей. Вернется ассоциативный массив.
Count
Возвращает число объектов подходящих под условия выборки
Методы, возвращающие измененный QuerySet
Вы можете вызывать эти методы последовательно:
Данный код возвращает всех пользователей с именем Max
живущих не в New York
с сортировкой
по адресу в обратном порядке.
Filter
Вы можете найти всех пользователей состоящих в группе с именем example
, используя следующий код:
group
в данном случае связь m2m
до модели Group
Exclude
Вы можете найти всех пользователей которые не состоят в группе с названием example
, используя следующий код:
group
в данном случае связь m2m
до модели Group
Order
Поиск всех пользователей и сортировка по имени:
Поиск всех пользователей и сортировка по имени в обратном порядке:
Поиск всех пользователей и сортировка в случайном порядке
Lookups
С помощью лукапов(lookups) вы можете фильтровать QuerySet.
Лукапы применяются в методах менеджера exclude()
и filter()
и передаются в них массивом,
где ключом массива являются поля (с лукапами), а значением - значение, по которому и производится фильтрация.
Пример лукапа:
Данный лукап указывает на то, что поле name
должно быть равно указанному значению. Пример применения:
Выбираем всех пользователей имя которых равно 'Max'.
На самом деле, лукап exact
является лукапом "по умолчанию". То есть, в данном примере можно было было обойтись условием filter(['name' => 'Max'])
.
isnull
Лукап, применяющийся для поиска значений NULL
в базе данных.
Пример применения:
Произойдет выбор всех пользователей cо значением имени в БД NULL
.
Если передать false
в качестве значения то sql запрос будет выглядеть слудющим
образом:
lte, lt
Лукапы, применяющиеся для поиска значений меньше заданного (lt
), и меньших либо равных заданному (lte
)
Пример lt
лукапа:
Произойдет выбор всех продуктов с ценой строго меньшей 100.00
.
Пример lte
лукапа:
Произойдет выбор всех продуктов с ценой меньшей, либо равной 100.00
.
lt
формирует слудющий sql:
lte
формирует слудющий sql:
gte, gt
Лукапы, применяющиеся для поиска значений больше заданного (gt
), и больших либо равных заданному (lte
)
Пример gt
лукапа:
Произойдет выбор всех продуктов с ценой строго большей 100.00
.
Пример gte
лукапа:
Произойдет выбор всех продуктов с ценой большей, либо равной 100.00
.
gt
формирует слудющий sql:
gte
формирует слудющий sql:
exact
Применяется для поиска значний строго равных заданному. Пример:
Произойдет выбор всех пользователей с именем 'Max'.
Лукап является лукапом по умолчанию, то есть в предыдущем примере можно указать просто ['name' => 'Max']
contains
Применяется для поиска значений в которых присутствует заданноу значение (аналог - SQL LIKE).
Регистрозависимый поиск. Для регистронезависимого используйте lookup icontains
.
Пример:
Произойдет выбор всех пользователей, в имени которых есть сочетание 'ax'.
icontains
Полностью повторяет lookup contains
, но осуществляет регистронезависимый поиск.
startswith
Применяется для поиска значений, начинающихся с заданного значения:
Регистрозависимый. Для регистронезависимого используйте lookup istartswith
.
Пример:
Произойдет выбор всех пользователей, имя которых начинается с 'M'.
istartswith
Полностью повторяет lookup startswith
, но осуществляет регистронезависимый поиск.
endswith
Применяется для поиска значний, заканчивающихся заданным значением:
Регистрозависимый. Для регистронезависимого используйте lookup iendswith
.
Пример:
Произойдет выбор всех пользователей, имя которых начинается с 'on'.
iendswith
Полностью повторяет lookup iendswith
, но осуществляет регистронезависимый поиск.
in
Применяется для поиска значений, попадающих в список переданных значений: Пример:
Произойдет выбор всех пользователей, pk которых попадают в список [1, 2]
.
Lookup может принимать QuerySet в качестве значения
Данный лукап позволяет принимать не только массив значений, но и объект QuerySet. В этом случае в запрос будет добавлен подзапрос.
Пример:
Произойдет выбор всех пользователей, имена групп которых начинаются с 'A'. Будет выполнен всего один запрос на выбор пользователей.
range
Данный лукап позволяет найти значения, расположенные между переданных значений. Данный лукап принимает массив из двух элементов.
Пример:
Произойдет выбор всех продуктов с ценой от 10 до 20.
year
Данный лукап работает только с полями типа DateTimeField
, DateField
.
Позволяет найти все значения, расположенные в заданном году.
Пример:
Произойдет выбор всех продуктов, добавленных в 2014 году.
Внимание: sql запрос будет отличаться для разных субд.
month
Данный лукап работает только с полями типа DateTimeField
, DateField
.
Позволяет найти все значения, расположенные в заданном месяце.
Пример:
Произойдет выбор всех продуктов, добавленных в декабре.
Внимание: sql запрос будет отличаться для разных субд.
day
Данный лукап работает только с полями типа DateTimeField
, DateField
.
Позволяет найти все значения, расположенные в заданном дне месяца.
Пример:
Произойдет выбор всех продуктов, добавленных 25 числа любого месяца.
Внимание: sql запрос будет отличаться для разных субд.
week_day
Данный лукап работает только с полями типа DateTimeField
, DateField
.
Позволяет найти все значения, расположенные в заданном дне недели.
Значения: 1 - Воскресенье, 2 - Понедельник, ..., 7 - Суббота. Порядок дней определяет ORM и подстраивает под текущую субд по следующей причине:
Пример:
Произойдет выбор всех продуктов, добавленных в понедельник.
Внимание: sql запрос будет отличаться для разных субд.
hour
Данный лукап работает только с полями типа DateTimeField
, TimeField
.
Позволяет найти все значения, расположенные в заданном часе.
Пример:
Произойдет выбор всех продуктов, добавленных в 10 часов.
Внимание: sql запрос будет отличаться для разных субд.
minute
Данный лукап работает только с полями типа DateTimeField
, TimeField
.
Позволяет найти все значения, расположенные в заданной минуте.
Пример:
Произойдет выбор всех продуктов, добавленных в 35 минут.
Внимание: sql запрос будет отличаться для разных субд.
second
Данный лукап работает только с полями типа DateTimeField
, TimeField
.
Позволяет найти все значения, расположенные в заданной секунде.
Пример:
Произойдет выбор всех продуктов, добавленных в 45 секунд.
Внимание: sql запрос будет отличаться для разных субд.
search
Не реализовано
regex
Поиск по регулярному выражению.
Регистрозависимый. Для регистронезависимого используйте lookup iregex
.
Пример:
Произойдет выбор всех продуктов, соответствующих регулярному выражению [a-z]
Внимание: sql запрос будет отличаться для разных субд.
iregex
Полностью повторяет предыдущий lookup, но осуществляет регистронезависимый поиск.
Внимание: sql запрос будет отличаться для разных субд.
Q-объекты (Query-объекты)
Q-объекты необходимы для удобного формирования условий выборки. Существует 2 Q-объекта: OrQ и AndQ.
Q-объект формируется следующим образом:
И затем его можно передать в методы filter или exclude:
Данный запрос выберет нам все заявки со статусом 1 от пользователя с id равным 1 и заявки со статусом 2 от пользователя с id равным 4.
All versions of orm with dependencies
hindy/application Version 0.*
hindy/logger Version ^1.0
hindy/query Version ^0.4
hindy/tests Version ^0.1.0
hindy/validation Version 0.1.4.*
imagine/imagine Version ^0.6.2
hindy/storage Version ^0.1.4