Как в PhalconPHP сделать выборку модели с отношениями?
Имеется уже достаточно большой проект на PhalconPHP. Он в целом устраивает меня чуть более чем полностью, но вот у моделей имеется 1 фатальный недостаток: нет метода with() или чего-либо подобного, что бы могло выбирать модель вместе с отношениями.
Эта проблема очень остра, поскольку на проекте есть некоторые модели, которые практически всегда используют данные из отношений при формировании страницы. Можно кэшировать, но простой LEFT JOIN по индексу обходился бы меньшей кровью памятью, чем кэширование.
Сам фреймворк сейчас переживает перепись ко 2 версии, на которую я с радостью перейду, но суть тут несколько в другом: сейчас такой функции нет.
Отсюда и вопрос: как можно расширить базовую модель PhalconPHP, чтобы научить его делать запросы с отношениями? Если же ничего совсем поделать нельзя, то поделитесь Standalone ORM для работы с базой данных.
P.S. пожалуйста не нужно писать о том, что я выбрал неправильный инструмент - инструмент хорош, вопрос только с этими отношениями.
Вы плохо читаете документацию...
Отношения там есть, вот тут смотрите в документации.
UPD
Отношения в Phalcon всякий раз при обращении к ним считываются из базы по новой,
чтобы такого поведения избежать, при объявление отношений в параметры укажите:
Нет, речь о том, что если у меня есть массив пользователей и я хочу получить для кажого из них скин (по ключу skin_id), то Phalcon будет выполнять для кажого пользователя по запросу на получение данных.
Я и спрашиваю про какую-либо реализацию with() метода.
Для правильной работы, необходим настроить соответствующие отношения между моделями, согласно документации Phalcon, а также обязательно указать alias для отношений, через соответствующий параметр при их определение.
Хм, похоже на решение моей проблемы. Пока оттестить возможности нету.
Касательно ПР, то его скорее всего отклонят: 2.0 должна сохранить функционал на уровне 1.3, просто что они перепишут его на Zend. Правда как-то печально это сейчас выглядит: последняя активность от пользователя Phalcon на Github была уже как 2 месяца назад, что печально символизирует.
ErickSkrauch: В таком синтаксисе, как вы привили сделать нет возможности из-за особенностей фреймворка. Только в моем варианта, доделать возможно смогу, но не сегодня. Вы это можете сделать самостоятельно, вам нужно будет $with разбить по точки, и запросить для их моделей соотвесвующие отношения и включить их JOIN.
P.S Вы же крос-модельным with(), понимаете связь с отношениями модели Skin, ну т.е как в YII
ErickSkrauch: 0_о на ZEND? Вы ничего не путаете? Его пишут на Zephir...
Что касается ПР его не отклонят, т.к он не нарушает обратной совместимости. Новый функционал можно добавлять, при условии сохранения полной обратной совместимости с API ветки 1.x
KorsaR-ZN: да, именно как в Yii. Просто я по работе сейчас активно знакомлюсь с Yii и некоторые вещи просто must have в Phalcon, особенно выборка моделей с отношениями. Отсюда и подобные вопросы ))
ErickSkrauch: Да, такое можно сделать. Только в ином синтаксисе, и немного с другим ответом.
Пример:
User::with(['skin', 'skin.uploader'], [
'columns' => 'user.*, skin.*'
}); // возвращает объект resultset, как при find()
Первым параметром принимает массив алиасов отношений, определенных в модели.
Вторым параметром принимает массив аналогичный тому, что принимает find(), но с дополнительным параметром: "alias"для задачи синонима к текущей модели, по умолчанию он равняется названию текущей модели, т.е "user"
Ответ аналогичен вызову функции find().
P.S мой вариант пока не поддерживает крос-модельные запросы, но его можно легко расширить...
KorsaR-ZN: возможно имеет смысл переопределить базовые find() и findFirst() и научить их парсить параметр "with", после чего определить базовую модель и жить довольно.
В целом можно создать репозиторий, в котором создать базовую модель с реализацией with через find() и findFirst(), ибо эта проблема актуальна и среди западных пользователей фреймворка.
Поможете с развитием репозитория? Я уже довольно много пишу на Phalcon, но до подобной реализации with не допёр сам ))
KorsaR-ZN: неа, я голосую за имеенно переопределение - это позволит использовать единый синтаксис.
Кроме того я покопался в исходниках и кое-что для себя вывел: можно с помощью рефлексии разблокировать поле $_related и занести в него выбранные модели, тем самым полностью обеспечив единый синтаксис.
Вообще удобнее будет общаться в Skype или Telegram. Добавьте меня пожалуйста по нику ErickSkrauch.