2012年10月13日 星期六

如何在Grails 上實現多對多的關係(三) : 三者的結構

首先你一定會先定義類別吧,我們一次要定義三個類別出來。

class LoginUsers {

}
class Roles{

}
class RoleUsers{
      //這個就是多對多的中間表,我們需要它來做很多事。
}
再來我們開始定義它們的關聯,也是很直觀。


// LoingUsers 1 <-> * RoleUsers * <-> 1 Roles

class LoginUsers {
    static hasMany = [ roleLink : RoleUsers ]
}
class Roles{
    static hasMany = [ userLink : RoleUsers ]
}
class RoleUsers{
    LoginUsers user
    Roles role
    static constraints = {
  
    }
    static belongsTo = [user:LoginUsers , role:Roles]
}
LoingUsers 1 <-> * RoleUsers * <-> 1 Roles 別說你看不懂喔,正規化是幼幼班的課程。
這邊比較特別的是…明明LoginUsers與Roles參照同一個表格,為何我取不同的名字,一個是roleLink一個是userLink ? 這是你使用上的自由…

從使用者的觀點來看,這是一個群組鏈結表。
從群組的觀點來看,這是一個使用者鏈結表。

所以我訂不同的名字。為了方便,你也可以都叫做 link:RoleUsers,這邊就隨你高興囉! 不過 Roles 不一定只和Users 做多對多,他也可以與功能做多對多,所以取名時還是多加幾個字比較好。

中間表裡的每一個record,每一個物件,都一定對到1個使用者與1個群組。

從使用者的觀點來說,他是一對多的,就像一個人可以寫很多本書,多方的書「屬於」作者。 所以這裡的多方 RoleUsers 是「屬於」使用者的。

從群組的觀點來說,也是一對多的,一個群組裡可以有多個使用者。

所以在這個中間鏈結表中,他同時「屬於」二者,中間表沒有什麼主權,所以他「屬於」別人。

用這樣的方式去理解應該就簡單了。

剛剛說,中間表裡的每一列都對應到一個使用者與一個群組,所以你當然要宣告他們才連的回去。 結構的部份搞清楚了,後面就不是很難理解了。內容請看下一章。

沒有留言:

張貼留言