Использование Cycle ORM

Обсуждаем разработку фреймворка: дизайн компонентов, API, пакеты
Ответить
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Использование Cycle ORM

Сообщение samdark »

Думаю над использованием 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
Аватара пользователя
SiZE
Сообщения: 2813
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Использование Cycle ORM

Сообщение SiZE »

Меня смутило из статьи сравнения с доктрин

Cycle currently does not support composite PKs
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Использование Cycle ORM

Сообщение anton_z »

Уж лучше eloquent. Больше соответсвует стилю Yii.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Использование Cycle ORM

Сообщение samdark »

Cycle currently does not support composite PKs
Планы это исправить есть.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Использование Cycle ORM

Сообщение samdark »

Вот так можно делать Active Record: https://github.com/cycle/docs/blob/mast ... -record.md
dimsog
Сообщения: 7
Зарегистрирован: 2019.07.02, 12:29

Re: Использование Cycle ORM

Сообщение dimsog »

С подходом по ссылке выше проще взять Doctrine и не париться. А опционально пакет yii-db будет? В котором будет QueryBuilder и AR портированный из Yii2. Я все жду жду :)
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Использование Cycle ORM

Сообщение samdark »

Вероятно да. У меня сил портировать его нет, но желающие этим заняться есть.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Использование Cycle ORM

Сообщение Loveorigami »

В YII AR есть один нерешенный кейс:

Есть самостоятельные сущности Category и Photo, а также связь many-to-many PhotoToCategory.
Одна фотография может находится в разных категориях на разных позициях.

Category: $id, $name;
Photo: $id, $name;
PhotoToCategory: $category_id, $photo_id, $pos

Задача:
- вытащить список фотографий, отсортированных внутри категории по PhotoToCategory->$pos

Cycle ORM может такое делать?
wolfy-j
Сообщения: 2
Зарегистрирован: 2019.07.29, 16:56

Re: Использование Cycle ORM

Сообщение wolfy-j »

@Loveorigami, Да сможет. Можно как с полным JOIN так и и внешним запросом, through таблица доступна в обоих случаях. Доки:
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('@.@.position'); // @ алиас для текущей связи, @.@ для through связи
    }
])->fetchAll();
SQL #1:

Код: Выделить всё

SELECT
"category"."id" AS "c0", "category"."title" AS "c1"
FROM "categories" AS "category"
SQL #2:

Код: Выделить всё

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
С полным JOIN:

Код: Выделить всё

$result = $categories->load('photos', [
     'method' => Select::SINGLE_QUERY,
     'load'   => function (Select\QueryBuilder $q) {
         $q->orderBy('@.@.position'); // @ алиас для текущей связи, @.@ для through связи
     }
])->orderBy('id')->fetchAll();
SQL:

Код: Выделить всё

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
В теории можно сортировать по связям к PhotoToCategory, но я не проверял. Пивот данные доступы в загруженной коллекции через `getPivot()` метод.
Ответить