我有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);
答案 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'),