Использование Cycle ORM
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Использование Cycle ORM
Думаю над использованием Cycle ORM в качестве одного из поддерживаемых слоёв для работы с базами данных. Опробовал на yii-demo.
https://github.com/yiisoft/yii-demo/pull/23
В pull request для описания схемы используются аннотации (Doctrine-совместимые). Данных сохраняются в SQLite.
Сравнение с Doctrine и Laravel Eloquent: https://github.com/cycle/docs/issues/3
Документация: https://github.com/cycle/docs
https://github.com/yiisoft/yii-demo/pull/23
В pull request для описания схемы используются аннотации (Doctrine-совместимые). Данных сохраняются в SQLite.
Сравнение с Doctrine и Laravel Eloquent: https://github.com/cycle/docs/issues/3
Документация: https://github.com/cycle/docs
Нравится Yii? Давайте сделаем его лучше!.
Re: Использование Cycle ORM
Меня смутило из статьи сравнения с доктрин
Cycle currently does not support composite PKs
Cycle currently does not support composite PKs
Re: Использование Cycle ORM
Уж лучше eloquent. Больше соответсвует стилю Yii.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Использование Cycle ORM
Планы это исправить есть.Cycle currently does not support composite PKs
Нравится Yii? Давайте сделаем его лучше!.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Использование Cycle ORM
Вот так можно делать Active Record: https://github.com/cycle/docs/blob/mast ... -record.md
Нравится Yii? Давайте сделаем его лучше!.
Re: Использование Cycle ORM
С подходом по ссылке выше проще взять Doctrine и не париться. А опционально пакет yii-db будет? В котором будет QueryBuilder и AR портированный из Yii2. Я все жду жду
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Использование Cycle ORM
Вероятно да. У меня сил портировать его нет, но желающие этим заняться есть.
Нравится Yii? Давайте сделаем его лучше!.
-
- Сообщения: 977
- Зарегистрирован: 2014.08.27, 21:54
Re: Использование Cycle ORM
В YII AR есть один нерешенный кейс:
Есть самостоятельные сущности Category и Photo, а также связь many-to-many PhotoToCategory.
Одна фотография может находится в разных категориях на разных позициях.
Category: $id, $name;
Photo: $id, $name;
PhotoToCategory: $category_id, $photo_id, $pos
Задача:
- вытащить список фотографий, отсортированных внутри категории по PhotoToCategory->$pos
Cycle ORM может такое делать?
Есть самостоятельные сущности Category и Photo, а также связь many-to-many PhotoToCategory.
Одна фотография может находится в разных категориях на разных позициях.
Category: $id, $name;
Photo: $id, $name;
PhotoToCategory: $category_id, $photo_id, $pos
Задача:
- вытащить список фотографий, отсортированных внутри категории по PhotoToCategory->$pos
Cycle ORM может такое делать?
Re: Использование Cycle ORM
@Loveorigami, Да сможет. Можно как с полным JOIN так и и внешним запросом, through таблица доступна в обоих случаях. Доки:
https://github.com/cycle/docs/blob/mast ... oad-method
https://github.com/cycle/docs/blob/mast ... to-many.md
Будет что-то вроде (выбрать все категории и загрузить фото отсортированное по PhotoToCategory->$position):
SQL #1:
SQL #2:
С полным JOIN:
SQL:
В теории можно сортировать по связям к PhotoToCategory, но я не проверял. Пивот данные доступы в загруженной коллекции через `getPivot()` метод.
https://github.com/cycle/docs/blob/mast ... oad-method
https://github.com/cycle/docs/blob/mast ... to-many.md
Будет что-то вроде (выбрать все категории и загрузить фото отсортированное по PhotoToCategory->$position):
Код: Выделить всё
$result = $categories->load('photos', [
'load' => function (Select\QueryBuilder $q) {
$q->orderBy('@[email protected]'); // @ алиас для текущей связи, @.@ для through связи
}
])->fetchAll();
Код: Выделить всё
SELECT
"category"."id" AS "c0", "category"."title" AS "c1"
FROM "categories" AS "category"
Код: Выделить всё
SELECT
"l_category_photos_pivot"."id" AS "c0", "l_category_photos_pivot"."position" AS "c1", "l_category_photos_pivot"."photo_id" AS "c2", "l_category_photos_pivot"."category_id" AS "c3", "category_photos"."id" AS "c4", "category_photos"."url" AS "c5"
FROM "photos" AS "category_photos"
INNER JOIN "photo_category_positions" AS "l_category_photos_pivot"
ON "l_category_photos_pivot"."photo_id" = "category_photos"."id"
WHERE "l_category_photos_pivot"."category_id" IN (1, 2, 3, 4)
ORDER BY "l_category_photos_pivot"."position" ASC
Код: Выделить всё
$result = $categories->load('photos', [
'method' => Select::SINGLE_QUERY,
'load' => function (Select\QueryBuilder $q) {
$q->orderBy('@[email protected]'); // @ алиас для текущей связи, @.@ для through связи
}
])->orderBy('id')->fetchAll();
Код: Выделить всё
SELECT
"category"."id" AS "c0", "category"."title" AS "c1", "l_l_category_photos_pivot"."id" AS "c2", "l_l_category_photos_pivot"."position" AS "c3",
"l_l_category_photos_pivot"."photo_id" AS "c4", "l_l_category_photos_pivot"."category_id" AS "c5", "l_category_photos"."id" AS "c6", "l_category_photos"."url" AS "c7"
FROM "categories" AS "category"
LEFT JOIN "photo_category_positions" AS "l_l_category_photos_pivot"
ON "l_l_category_photos_pivot"."category_id" = "category"."id"
INNER JOIN "photos" AS "l_category_photos"
ON "l_category_photos"."id" = "l_l_category_photos_pivot"."photo_id"
ORDER BY "category"."id" ASC, "l_l_category_photos_pivot"."position" ASC