2016-01-29 81 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