2012-04-22 86 views
0

我使用cakephp 2.1.1。 这是我的桌子协会:x hasmany y hasmany z hasmany w。CakePHP 2.1.1。可容忍的行为不起作用

一切都是正确的设置我想,但是当我做这个查询:

$conditions = array(
'contain' => array(
'y' => array (
      'z' => array(
       'w'=> array(
        'conditions' => array('col>=' => $q)) 
    ) 
) 
)); 

$this->loadmodel('x'); 
$o=$this->x->find('all',$conditions);//array(
debug($o); 

我没有我想要的结果;只有表格x被提取!为什么? 例如,这是我的模型X的PHP代码,类似于其他:

<? php 

class x extends AppModel 
{ 
    var $name='x'; 
    public $actsAs = array('Containable'); 
    public $hasMany = array('y'); 
} 

也许CakePHP的版本? 谢谢!

信息:我要让声明是这样的:

select z.col1, y.col2, x.col3 
from z, y, x, w 
where w.col>= 3 
and w.z_id = z.id 
and z.y_id = y.id 
and z.x_id = x.id 

回答

1

有相当多的点这里。首先,如果行为不起作用,那么可能不会假设任何事情,最重要的是一切都很好! ;)

我认为你已经剥离了大量的代码,因为你的关系没有定义任何外键,如果Cake要连接你的模型,这是非常关键的。

不知道你为什么使用loadModel(),因为这种事情应该在模型X的控制器或X模型中完成。所以你不应该加载模型。如果您的关联工作正常,则Contain将随着模型一起加载模型。

至于你预期的SQL语句,不幸中可容纳不加入模型这样的,并会加入少数机型,但如果你有hasMany它将运行一系列SELECT语句来获得额外的数据,然后加入它一起。

它也使用LEFT JOIN而不是您预期的CROSS JOIN。这可以在Containable的选项中配置,或者你可以实例化一个新的db对象并创建一个子查询。

要回到你的问题,

希望这给你一个起点,如果你还没有解决这个当然!