[英]Grails many to many with join table + extra columns
我需要創建一個自定義的聯接表,以重新建模多對多映射,並且在此發布了一些不錯的文章之后,提出了以下模型。
現在我的問題是,如果我在GSP中有一個Course或Journey對象,我該如何訪問屬於聯接表的額外列數據。
在此示例中,如果我有旅程或課程實例,我想訪問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}
無效(如您所發現)。
如果您將常規表達式分解為: course.courseJourneyDetail
,那么根據您創建的關系,這實際上就沒有意義。 原因是, Course
沒有單個CourseJourneyDetail
,而是一個集合。
如果您希望將Course
和Journey
保持一對一關系,但要使用帶有附加列的static hasHany
表,則需要更改域結構以反映這一點:您應該切換而不是在每個類中使用static hasHany
到一個實例。
如果您希望保持多對多關系,那么您需要考慮如何獲取代表關聯的適當聯接對象。 一個例子:
CourseJourneyDetail.findAllByCourseAndJourney(<courseInstance>, <journeyInstance>)
如果要為所有多對多關聯收集其他列,則可以使用便捷方法中已經使用的語法( getJournies
和getCourses
):
course.journies*.extraColumn1
這將輸出一個字符串數組,因此在${}
表達式中使用它的意義較小。 以及g:each
更多意義。 這完全取決於您如何計划使用此數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.