0

我正在使用 cakephp 2.1.1。这是我的表关联:x hasmany y hasmany z hasmany w。

我认为一切都正确设置但是当我进行此查询时:

$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
4

1 回答 1

1

这里有很多点。

首先,如果 Behavior 不起作用,则可能不应该假设任何事情,最重要的是一切都很好!;)

我假设您已经删除了大量代码,因为您的关系没有定义任何外键,如果 Cake 要连接您的模型,这非常关键。

不知道你为什么要使用loadModel()这种东西,因为这种事情应该在 Model X 的控制器或 X Model 中完成。所以你不应该加载模型。如果您的关联工作正常,Contain 将在运行过程中加载模型。

至于你所期望的 SQL 语句,不幸的是 Containable 不会像这样加入模型,并且会加入几个模型,但是如果你有hasMany它会运行一系列SELECT语句来获取额外的数据,然后将它们全部加入。

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

回到你的问题,

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

于 2012-07-27T09:43:30.227 回答