Страница 1 из 1

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

Добавлено: 2019.09.09, 02:37
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

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

Добавлено: 2019.09.09, 08:30
SiZE
Меня смутило из статьи сравнения с доктрин

Cycle currently does not support composite PKs

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

Добавлено: 2019.09.09, 08:39
anton_z
Уж лучше eloquent. Больше соответсвует стилю Yii.

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

Добавлено: 2019.09.09, 16:55
samdark
Cycle currently does not support composite PKs
Планы это исправить есть.

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

Добавлено: 2019.09.12, 17:07
samdark
Вот так можно делать Active Record: https://github.com/cycle/docs/blob/mast ... -record.md

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

Добавлено: 2019.09.17, 09:07
dimsog
С подходом по ссылке выше проще взять Doctrine и не париться. А опционально пакет yii-db будет? В котором будет QueryBuilder и AR портированный из Yii2. Я все жду жду :)

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

Добавлено: 2019.09.17, 13:08
samdark
Вероятно да. У меня сил портировать его нет, но желающие этим заняться есть.

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

Добавлено: 2019.09.24, 10:01
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 может такое делать?

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

Добавлено: 2019.09.24, 15:48
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('@[email protected]'); // @ алиас для текущей связи, @.@ для 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('@[email protected]'); // @ алиас для текущей связи, @.@ для 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()` метод.