2015-10-21 28 views
0

我有3个表(实际上有4个是因为多关系的连接表)。使用'with'子句的复杂CDbCriteria

可以说,他们是: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); 
+0

一切正常,在我的设置用U提供的数据。从yii调试器发布查询,也许它会让我们更深入地了解发生了什么。 – xReprisal

+0

如何检索构造的查询?你是否使用了我的评论中的'with'数组或者你的评论中的数组?我一直在努力都没有成功。 – Gizmoh

+0

是的,我在你的文章中使用了标准。使用CLogRouter记录日志中的查询.docs用于记录yii:http://www.yiiframework.com/doc/guide/1.1/en/topics.logging – xReprisal

回答

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'), 
+0

我用关系更新了我的问题。我认为我不需要使用gp_join表,因为'with'属性能够处理many_many关系。我认为有很多关系的关键是他们可以用'with'来访问。我想我可能误解了关系的目的。 – Gizmoh