复杂的CDbCriteria使用'with'子句

时间:2015-10-21 02:00:19

标签: php mysql yii

我有3个表(实际上有4个表,因为有许多关系的连接表)。

让我们说:grandparent(g)parent(p)child(c)gp_join(gp)用于祖父母 - 父母多对多关系的加入表。有以下关系:

祖父母关系:

'parent' => array( self::MANY_MANY, 'Parent', 'gp_join(g_id, p_id)' )

家长关系:

'grandparent' => array( self::MANY_MANY, 'Grandparent', 'gp_join(p_id, g_id)' ),
'child' => array( self::HAS_MANY, 'Child', 'p_id' )

儿童关系:

'parent' => array( self::BELONGS_TO, 'Parent', 'p_id' )

我想找到一个祖父母的所有孙子。我有一个成功执行此操作的SQL查询,但我需要知道如何使用Yii框架(最好使用'with'属性,因为它很酷)。

使用SQL语句:

SELECT c.name
FROM grandparent `g`
JOIN gp_join `gp` ON gp.g_id=g.g_id
JOIN parent `p` ON p.p_id=gp.p_id
JOIN child `c` ON c.p_id = p.p_id
WHERE g.g_id=12;

这是我一直在尝试的东西(不管他们是否有正确的祖父母,它都会让每个孩子都回归):

$criteria = new CDbCriteria();
$criteria->with['parent'] = array (
    'with' => array(
            'grandparent' => array( 
            'alias' => 'g',
            'condition' => 'g.g_id='.$this->g_id
        )
     ),
    'alias' => 'p',
    'condition' => 'p.p_id=t.list_id'
);
return Child::model()->findAll($criteria);

1 个答案:

答案 0 :(得分:0)

我建议删除gp_join表并将这三个表与MANY_MANY关系连接起来,因为你已经在父和子之间有了这样的关系。最好使其保持一致。
我没有看到你的关系,但我看到你试图连接父母和祖父母而不使用gp_join表的问题,如果你有条件,这将不起作用。
这是它应该是什么样子

$criteria->with['parent'] = array (
        'with' => array(
            'gpJoin' => array(
                'with'=> array(
                    'grandparent'=> array(
                        'alias' => 'g',
                        'condition' => 'g.g_id=:g_id',
                        'params'    => array(':g_id' => $this->g_id),
                    )
                ),
            )
        ),
    );

我添加了gpJoin关系并更改了条件,因此它不容易进行SQL注入。

儿童关系

'parent'    => array(self::MANY_MANY, "Parents", 'parent(p_id, p_id)'),

父母关系

'gpJoin'    => array(self::HAS_MANY, 'GpJoin', 'p_id'),

GpJoin关系

'parent'    => array(self::HAS_ONE, 'Parents', 'p_id'),
'grandparent'   => array(self::BELONGS_TO, 'Grandparent', 'g_id'),