yii之relations關聯非主鍵

2022-02-12 08:35:16 字數 1798 閱讀 9045

yii的relations裡self::belongs_to預設是用當前指定的鍵跟關聯表的主鍵進行join,例如:

return array(

'reply' => array(self::belongs_to, 'bookpostreply', 'postid'),

);預設生成的sql是 on id = postid,id是bookpostreply的主鍵。

但今天我遇到的需求卻是需要生成 on bookpostreply.postid = t.postid,不去關聯主鍵,而且關聯其中乙個欄位的值,怎麼搞都搞不定,論壇也翻了個遍,不得不說,yii的論壇搜尋功能真的很爛,每次用都要從一堆的內容裡過濾資訊,還不見的能找到自己想要的,而且手冊也比較簡單,對這些東西沒有做比較深入的解答。

後來無意中看到有個on的屬性,剛好跟sql裡的on一樣,於是抱著試試的想法,在配置裡加了上去

return array(

'reply' => array(self::belongs_to, 'bookpostreply', 'postid', 'on' => 't.postid=reply.postid'),

);看除錯資訊裡的sql語句,發現yii生成了一條 on id = postid and t.postid=reply.postid 這樣的語句,看到這就已經明白這個東西的作用了,於是將postid清空,改成如下:

return array(

'reply' => array(self::belongs_to, 'bookpostreply', '', 'on' => 't.postid=reply.postid'),

);再來個例子:

有兩張表,設計結構如下:

商品表:字段:p_id,member_id

商鋪表:字段:shop_id,member_id

其中p_id,shop_id都是主鍵,member_id是索引

考慮過這個原因,是最初設計的時候,每乙個普通使用者都可以發布商品,所以商品表沒有記錄shop_id。

可能也會考慮過,每乙個使用者會有多個商鋪吧,所以shop表的member_id也不是唯一索引。

然後,我用yii在做表關聯,事實上,在我們改動程式的時候,我們已經把普通使用者能夠發布商品這個功能去掉了,因此,事實上對我們來說member_id,其實肯定是於shop表中的member_id有對應關係。

於是我在shopproduct的relations這樣寫

php**

/**

* @return array relational rules.

*/public function relations()

是的,看上去好象沒問題,但是實際卻關聯不上。

在yii的**中,關於relation的on是這樣寫的:

xml/html**

所以,上述的**在sql中顯示出來就是 select * from product left outer join shop on (product.member_id = shop.shop_id and product.member_id = shop.member_id)//這個**是偽**,只是為了說明問題。

出現這種情況可以將foreignkey欄位設為空,然後再指定on。

php**

/**

* @return array relational rules.

*/public function relations()

查詢的時候必須使用'with'關鍵字,例如

member::model()->with('shop')->findall($criteria);

Yii1學習筆記之relations

relations格式 varname array relationtype classname foreignkey additional options 需要弄清楚的幾點 1,varname指什麼?是乙個對像,乙個宣告此項關係的對像 2,relationtype。一共有4種,分別為self ha...

Yii中的relations方法

以blog示例 重點看注釋 user類中的relations方法如下 public function relations post中的方法如下 public function relations comment中的ralations方法如下 public function attributelabe...

Yii中relations的用法

class amspricenewcar extends amcpricenewcar public function searchmaintain 1 這裡遇到的問題,用了 criteria join方法,查詢報錯,原因是gocar mileage表與主表中有欄位名相同,於是用了 criteria...