2014-07-10 36 views
1

我必須通過第三個關係表連接表。但是,兩個表中的一個具有複合主鍵(見下文)。 如何在模型中聲明MANY_MANY關係?YII多對多關係和複合主鍵

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) 
) 

回答

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

我希望這可以幫助你。

+0

@jira它沒有工作? – Goodnickoff

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) 
) 

你當然可以添加其他領域的關係本身的屬性,如許多這些部分(第一臺)怎麼走進入製作部件(第二張表)。但是上面的定義是一個全功能的,如果只是最小的交集表。