YII多对多关系和复合主键

时间:2014-07-10 07:02:38

标签: php sql yii

我必须通过第三个关系表连接表。但是,这两个表中的一个具有复合主键(见下文)。 如何在模型中声明MANY_MANY关系?

CREATE TABLE T1 (
id integer,
someOtherID integer,
somevalue text,
PRIMARY KEY(id, someOtherID)
)

CREATE TABLE T2 (
id integer PRIMARY KEY,
value text
)

CREATE TABLE R (
rID1 integer,
rOtherID1 integer,
rID2 integer REFERENCES T2(id),
FOREIGN KEY (rID1, rOtherID1) REFERENCES T1(id, someOtherID),
PRIMARY KEY (rID1, rOtherID1, rID2)
)

2 个答案:

答案 0 :(得分:1)

尝试覆盖模型中的CActiveRecord::primaryKey()方法:

//for T1 model
public function primaryKey()
{
    return array('id', 'someOtherID');
}

关系声明将是:

public function relations()
{
    return array(
        ...
        'T2'=>array(self::MANY_MANY, 'T2', 'R(rID2, rID1)'),
        ...
    );
}

也许你应该为关系添加条件:

'T2'=>array(self::MANY_MANY, 'T2', 'R(rID2, rID1)', 'condition'=>'R.someOtherID = t.someOtherID'),

我希望这对你有所帮助。

答案 1 :(得分:0)

无论主表中定义了哪种键,交叉表的定义方式几乎相同。定义第一个表的键的字段,并将其定义为该表的FK。定义第二个表的键的字段,并将其定义为该表的FK。然后将两组字段定义为交集表的复合键。

你大部分都是在你的例子中完成的:

CREATE TABLE R (
  t1_ID integer,
  t1_someOtherID integer,
  t2_ID integer,
  FOREIGN KEY (t1_ID, t1_someOtherID) REFERENCES T1(id, someOtherID),
  foreign key( t2_id ) references T2( id ),
  PRIMARY KEY( t1_ID, t1_someOtherID, t2_ID )
)

当然,您可以添加其他字段作为关系本身的属性,例如这些部分(第一个表)中有多少个进入 子组件(第二个表)。但是上面的定义是一个功能齐全的,如果是最小的交叉表。