Я работал с CakePHP в течение двух лет и не нашел удовлетворительного решения для этого, поэтому однажды я написал решение для него. Я создал новый вид ORM, который работает как плагин поверх CakePHP 2.x. Я назвал это "кремом".
Он работает аналогично объектам CakePHP 3.0, но дополнительно поддерживает наследование нескольких таблиц. Он также поддерживает очень удобный просмотр структуры данных (ленивая загрузка) и очень прост в настройке. На мой взгляд, это мощнее, чем CakePHP 3.0 предлагает прямо сейчас. Просмотр структуры данных работает следующим образом:
$entity = new Entity('SomeModel', $somePrimaryKeyValue);
$foo = $entity->RelatedModel()->YetAnotherRelatedModel()->someProperty();
Однако важно отметить, что в Cream каждый объект-сущность представляет собой совокупность серии моделей и значений первичного ключа, которые объединены вместе. По крайней мере, в случае использования модели наследования. Такое соединение выглядит так:
[<'SomeConcreteModel', primaryKeyValueA>, <'IntermediaryModel', primaryKeyValueB>, <'BaseModel', primaryKeyValueC>]
Важно отметить, что вы можете подобрать эту сущность с помощью любой из указанных комбинаций модель / primaryKeyValue. Все они относятся к одной и той же сущности.
Используя это, вы также можете решить вашу проблему. Вы можете использовать стандартные методы поиска CakePHP, чтобы найти все значения первичных ключей, которые вы хотите получить из базовой модели, или вы можете использовать модели методов поиска, которые наследуются от нее, а затем пойти дальше и создать сущности.
Вы устанавливаете цепочку наследования / расширения, просто записывая в свой класс модели:
public $extends = 'YourBaseModel';
Кроме того, вам также необходимо установить обычные отношения CakePHP между моделями (hasOne или serveTo). Он работает так же, как в обычном ООП, с цепочкой моделей, которые наследуются от их баз. Если вы просто используете vanilla CakePHP, вы просто заметите, что эти модели связаны, но когда вы начнете использовать интерфейс Cream, все сущности объединят пары model / primaryKeyValue в один объект.
В моем репозитории github есть файл powerpoint, который объясняет большинство основных функций.
https://github.com/erobwen/Cream
Возможно, мне стоит раскошелиться на проект CakePHP и сделать запрос на извлечение, но пока это отдельный репозиторий. Пожалуйста, не стесняйтесь комментировать или участвовать в разработке "Cream".
Кроме того, для тех, кто предполагает, что лучше всего «работать с потоком CakePHP, как предполагалось», я бы сказал следующее. Общие оценки показывают, что программы на C в 2,5 раза больше, чем аналог C ++. Учитывая, что единственная особенность, которая разделяет эти языки, - это ООП с наследованием и т. Д., Мы можем сделать вывод, что отсутствие надлежащего ООП с наследованием и т. Д. Требует от программиста дополнительной работы с кодом повторения на 150% и т. Д. Механизм наследования в CakePHP очень нужен. Крем является попыткой этого.