2016-01-29 107 views
0

我需要創建一個自定義連接表來重新建模多對多映射,並在下面的一些偉大的帖子後面出現了下面的模型。Grails多對多連接表+額外列

現在我的問題是,如果我在GSP中有一個Course或Journey對象,如何訪問屬於連接表的額外列數據。

在這個例子中,我要訪問一個名爲extraColumn1領域的CourseJourneyDetail我GSP內,如果我有任何一段航程或路線實例

我已經試過如下:

$ {當然。 courseJourneyDetail.extraColumn1}

但它沒有工作。

這裏是(相關部分)我的域名類別:

class Course { 

     static hasMany = [journies:   CourseJourneyDetail] 

     String courseName 
     String organisersDescription 


     Set<Journey> getJournies() { 
      return CourseJourneyDetail.findAllByCourse(this)*.journey 
     } 
    } 

    class Journey { 

     static hasMany = [courses: CourseJourneyDetail] 

     java.util.Date dateCreated 
     java.util.Date lastUpdated 
     boolean enabled = true 

     User user 


     Set<Course> getCourses() { 
      return CourseJourneyDetail.findAllByJourney(this)*.course 

     } 
} 

class CourseJourneyDetail implements Serializable { 

    String extraColumn1 

    static belongsTo = [course: Course, journey: Journey] 

    boolean equals(other) { 
     if (!(other instanceof CourseJourneyDetail)) { 
      return false 
     } 

     other.journey?.id == journey?.id && 
       other.course?.id == course?.id 
    } 

    int hashCode() { 
     def builder = new HashCodeBuilder() 
     if (course) builder.append(course.id) 
     if (journey) builder.append(journey.id) 
     builder.toHashCode() 
    } 

    static constraints = { 
    } 

    static mapping = { 
     version false 
     id composite: ['course', 'journey'] 
    } 
} 
+0

在GSP中,$ {courses.journies}和$ {journey.courses}按預期返回相關列表。 –

回答

1

既然你已經確定每個Course/JourneyCourseJourneyDetail的,而不是一個單一實例的集合,${course.courseJourneyDetail.extraColumn1}將無法​​正常工作(如你所發現的)。

如果您將常規表達式細分爲:course.courseJourneyDetail,則根據您創建的關係確實沒有意義。原因是,Course沒有單個CourseJourneyDetail,而是一個集合。

如果你的願望是有CourseJourney在一比一的關係,但與其他列連接表,那麼你的域結構需要改變以反映這一點:不是每個類使用static hasHany,你會切換到單個實例。

如果您希望保持多對多關係,那麼您需要考慮如何獲取表示關聯的適當連接對象。舉個例子:

CourseJourneyDetail.findAllByCourseAndJourney(<courseInstance>, <journeyInstance>) 

如果你想收集所有的許多-to-many關聯的附加列,您可以使用您已經使用在便於學習方法(getJourniesgetCourses)語法:

course.journies*.extraColumn1 

這將輸出一個字符串數組,因此它的用法在${}表達式中的含義較少;在g:each內更有意義。這完全取決於你如何計劃使用這些數據。

+0

非常感謝您的詳細幫助。你促使我重寫了一點,但沒有意識到,下面似乎已經解決了我的問題:'static hasMany = [courseJourneyDetails:CourseJourneyDetail]'。我留下了方便的方法'getJournies'和'getCourses'。但是,現在我可以在GSP中使用'$ {course.courseJourneyDetails.mainEvent}' –

+0

訪問extraField1。非常感謝您的詳細幫助。你促使我重寫了一點,但沒有意識到,下面似乎已經解決了我的問題:'static hasMany = [courseJourneyDetails:CourseJourneyDetail]'。我留下了方便的方法'getJournies'和'getCourses'。但是,我現在可以在GSP中使用'$ {course.courseJourneyDetails.mainEvent}'訪問extraField1。這將按照您的建議返回一個列表,並且可以更好地使用'g:each'來訪問。注意:'$ {course.journies * .extraColumn1}'不能像我使用'static hasMany = [journies:CourseJourneyDetail]' –

+1

'course.courseJourneyDetails.mainEvent'返回一個列表,因爲它相當於'course.courseJourneyDetails * .mainEvent'。 '* .'語法是'collect'的一個快捷方式,當使用'.'訪問列表的屬性(通常不可能)時,它的作用也是'collect'。 – tylerwal

相關問題