我必须通过第三个关系表连接表。但是,这两个表中的一个具有复合主键(见下文)。 如何在模型中声明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)
)
答案 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 )
)
当然,您可以添加其他字段作为关系本身的属性,例如这些部分(第一个表)中有多少个进入的 子组件(第二个表)。但是上面的定义是一个功能齐全的,如果是最小的交叉表。