Да, использование Containable, вероятно, работает; например,
// function in AController
$this->paginate = array(
'conditions' => array('A.client' => 'foo'),
'contain' => array(
'B' => array(
'C' => array(
'D'
)
)
)
);
CakePHP объединит A к B, B к C и C к D. Я думаю, что это, вероятно, самый простой способ получить данные, которые находятся на расстоянии 4 моделей. Что касается неэффективности, вы можете использовать элемент sql_dump в сочетании с «объяснением плана», чтобы убедиться, что ваш запрос использует индексы надлежащим образом.