Для всех, кто может наткнуться на этот пост, попытка включить в свой запрос find или paginate модели, имеющие более 2 уровней глубины, не является простой задачей, если не сказать больше.
Пункт номер один, который продолжал подниматься, заключался в том, что CakePHP выполняет отдельные запросы для каждой ассоциации hasMany и hasAndBelongsToMany, что делает практически невозможным включение их в условия поиска.
Мне представили 2x решения:
1) Создание пользовательского типа запроса
2) Используйте функции unbindModel и bindModel и заново создайте ассоциации как hasOne
Я выбрал пункт 2, потому что пункт 1 казался сомнительным, когда я читал документы (и это было рекомендовано только в качестве крайней меры), и это позволило мне изменить ассоциацию на лету, а затем сбросить ее, продолжая весело с ассоциациями как я и предполагал.
Для тех, кому интересно, у меня был модельный проект, у которого есть много ProjectTag, который принадлежит тегу. Было невозможно использовать Tag или ProjectTag в моих типах поиска, поэтому я сделал следующее:
Я использовал метод unbindModel () в Project, ProjectTag и Tag, удаляя все их ассоциации, по сути, освобождая все связи.
Затем я применил bindModel () к Project, ProjectTag и Tag. Наиболее важным был порядок (иерархия), в котором я применил эти обозначения, потому что я использовал свойство 'condition', которое позволило мне связать модель 'A' с моделью B, используя условия SQL WHERE. Например:
$this->Project->ProjectTag->unbindModel(array(
'belongsTo' => array('Tag')
));
$this->Project->unbindModel(array('hasMany' => array('ProjectTag')));
$this->Project->bindModel(array('hasOne' => array('ProjectTag' => array('foreignKey' => false, 'conditions' => array('ProjectTag.project_id = Project.id')))));
$this->Project->bindModel(array('hasOne' => array('Tag' => array('foreignKey' => false, 'conditions' => array('Tag.id = ProjectTag.tag_id')))));
Теперь мы можем использовать Tag.id так, как будто он имеет отношение hasOne к Project, что позволяет нам применять условия поиска непосредственно к тегу при возврате связанных проектов.
НЕОБХОДИМО, чтобы вы связали все отношения, которые используются в рассматриваемых моделях, иначе они порвутся.
Надеюсь, это поможет тем, кто сталкивается с той же проблемой.