我有连接顺序的问题.类似的问题是另一个问题Manipulating Order of JOINS in CakePHP.答案是使用可容纳行为.就我而言,这是不可接受的,因为我有更深的关联,而containable会生成太多查询. Containable不会为三个级别的关联生成联接.它为第二级表中的每个条目生成其他查询.
我的查询是:
$this->LevelOne->find('all', array(
'joins' => array(array(
'table' => 'level_three',
'alias' => 'LevelThree',
'type' => 'LEFT',
'conditions' => array(
'LevelThree.id = LevelTwo.level_three_field_id'
)
))
));
这里的问题是,cake会生成多个联接,但是LevelThree表的联接是在LevelTwo表的联接之前完成的,并且会引发SQL错误“ on子句中的未知列’LevelTwo.level_three_field_id”.如果在所有LevelTwo联接之后将LevelThree联接置于查询的末尾,那么查询就可以了.
那么,问题是如何更改联接顺序?
解决方法:
最后,我弄清楚了如何做到这一点:
$this->LevelOne->unbindModel(array('belongsTo' => array('LevelTwo')));
$this->LevelOne->find('all', array(
'joins' => array(
array(
'table' => 'level_two',
'alias' => 'LevelTwo',
'type' => 'LEFT',
'conditions' => array(
'LevelTwo.id = LevelOne.level_two_field_id'
)
),
array(
'table' => 'level_three',
'alias' => 'LevelThree',
'type' => 'LEFT',
'conditions' => array(
'LevelThree.id = LevelTwo.level_three_field_id'
)
)
)
));