Я нашел два способа обойти это.
Первый - определить ассоциацию второго уровня непосредственно в модели.
Теперь вы будете иметь доступ к этим данным везде.
Это должно выглядеть примерно так .....
var $belongsTo = array(
'Foo' => array(
'className' => 'Foo', //unique name of 1st level join ( Model Name )
'foreignKey' => 'foo_id', //key to use for join
'conditions' => '',
'fields' => '',
'order' => ''
),
'Bar' => array(
'className' => 'Bar', //name of 2nd level join ( Model Name )
'foreignKey' => false,
'conditions' => array(
'Bar.id = Foo.bar_id' //id of 2nd lvl table = associated column in 1st level join
),
'fields' => '',
'order' => ''
)
);
Проблема этого метода в том, что он может сделать общие запросы более сложными, чем они должны быть.
Таким образом, вы также можете добавлять запросы второго уровня непосредственно в оператор find или paginate следующим образом: (Примечание: я обнаружил, что по какой-то причине вы не можете использовать ассоциации $ ownTo в соединениях второго уровня, и вам потребуется переопределить их, если уже определены, например, если 'Foo' уже определено в $ ownTo, вам нужно создать дубликат 'Foo1', чтобы заставить ассоциацию работать, как в примере ниже.)
$options['joins'] = array(
array('table' => 'foos',
'alias' => 'Foo1',
'type' => 'inner',
'conditions' => array(
'CurrentModel.foo_id = Foo1.id'
)
),
array('table' => 'bars',
'alias' => 'Bar',
'type' => 'inner',
'foreignKey' => false,
'conditions' => array(
'Bar.id = Foo1.bar_id'
)
)
);
$options['conditions'] = array('Bar.column' => "value");
$this->paginate = $options;
$[modelname] = $this->paginate();
$this->set(compact('[modelname]'));
Надеюсь, это достаточно ясно, чтобы понять и помочь кому-то.