簡體   English   中英

使用連接表+額外的列使許多人陷入困境

[英]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 ,而是一個集合。

如果您希望將CourseJourney保持一對一關系,但要使用帶有附加列的static hasHany表,則需要更改域結構以反映這一點:您應該切換而不是在每個類中使用static hasHany到一個實例。

如果您希望保持多對多關系,那么您需要考慮如何獲取代表關聯的適當聯接對象。 一個例子:

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

如果要為所有多對多關聯收集其他列,則可以使用便捷方法中已經使用的語法( getJourniesgetCourses ):

course.journies*.extraColumn1

這將輸出一個字符串數組,因此在${}表達式中使用它的意義較小。 以及g:each更多意義。 這完全取決於您如何計划使用此數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM