Grails 多对多连接 table + 额外的列
Grails many to many with join table + extra columns
我需要创建一个自定义连接 table 来重新建模多对多映射,并根据此处的一些精彩帖子提出了以下模型。
现在我的问题是,如果我在 GSP 中有一个 Course 或 Journey 对象,我该如何访问属于连接的额外列数据 table。
在此示例中,如果我有旅程或课程实例,我想访问我的 GSP 中 CourseJourneyDetail 中名为 extraColumn1 的字段
我尝试了以下方法:
${course.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']
}
}
由于您已经确定每个 Course
/Journey
都有 CourseJourneyDetail
的集合而不是单个实例,因此 ${course.courseJourneyDetail.extraColumn1}
将不起作用(如您所见)。
如果您将 groovy 表达式分解为:course.courseJourneyDetail
,根据您创建的关系,它实际上没有任何意义。原因是,Course
没有一个 CourseJourneyDetail
,而是一个集合。
如果您希望 Course
和 Journey
处于一对一关系中,但连接 table 具有额外的列,那么您的域结构需要更改以反映这一点:与其在每个 class 中使用 static hasHany
,不如切换到单个实例。
如果您希望保持多对多关系,那么您需要考虑如何获取表示关联的适当连接对象。一个例子:
CourseJourneyDetail.findAllByCourseAndJourney(<courseInstance>, <journeyInstance>)
如果您想要为所有多对多关联收集额外的列,您可以使用您已经在方便方法中使用的语法(getJournies
和 getCourses
) :
course.journies*.extraColumn1
这将输出一个字符串数组,因此它在 ${}
表达式中的用法意义不大;更有意义的是 g:each
。这完全取决于您打算如何使用这些数据。
我需要创建一个自定义连接 table 来重新建模多对多映射,并根据此处的一些精彩帖子提出了以下模型。
现在我的问题是,如果我在 GSP 中有一个 Course 或 Journey 对象,我该如何访问属于连接的额外列数据 table。
在此示例中,如果我有旅程或课程实例,我想访问我的 GSP 中 CourseJourneyDetail 中名为 extraColumn1 的字段
我尝试了以下方法:
${course.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']
}
}
由于您已经确定每个 Course
/Journey
都有 CourseJourneyDetail
的集合而不是单个实例,因此 ${course.courseJourneyDetail.extraColumn1}
将不起作用(如您所见)。
如果您将 groovy 表达式分解为:course.courseJourneyDetail
,根据您创建的关系,它实际上没有任何意义。原因是,Course
没有一个 CourseJourneyDetail
,而是一个集合。
如果您希望 Course
和 Journey
处于一对一关系中,但连接 table 具有额外的列,那么您的域结构需要更改以反映这一点:与其在每个 class 中使用 static hasHany
,不如切换到单个实例。
如果您希望保持多对多关系,那么您需要考虑如何获取表示关联的适当连接对象。一个例子:
CourseJourneyDetail.findAllByCourseAndJourney(<courseInstance>, <journeyInstance>)
如果您想要为所有多对多关联收集额外的列,您可以使用您已经在方便方法中使用的语法(getJournies
和 getCourses
) :
course.journies*.extraColumn1
这将输出一个字符串数组,因此它在 ${}
表达式中的用法意义不大;更有意义的是 g:each
。这完全取决于您打算如何使用这些数据。