2016-11-30 50 views
1

所以我有兩個表:Class和Course。每個課程都有一個course_id,用於定義課程表上的課程類型。這裏是我的模型:如何從2個表中查詢信息並加以聚類

const Class = sequelize.define('class', { 
    class_date: Sequelize.DATE, 
    begin_time: Sequelize.TIME, 
    end_time: Sequelize.TIME, 
    max_capacity: Sequelize.INTEGER, 
    is_published: Sequelize.BOOLEAN, 
    training_facility_id: Sequelize.INTEGER, 
    state_id: Sequelize.INTEGER, 
    registration_deadline: Sequelize.DATE, 
    course_id: Sequelize.INTEGER, 
    is_report_60_generated: Sequelize.BOOLEAN, 
    completed_by_user_id: Sequelize.INTEGER 
}, { 
    timestamps: false, 
    freezeTableName: true 
}) 

const Course = sequelize.define('course', { 
    code: Sequelize.STRING, 
    name: Sequelize.STRING 
}, { 
    timestamps: false, 
    freezeTableName: true 
}) 

當我打到類端點,我得到一個類的數組。我將如何設置查詢來響應每個類的課程名稱和代碼,而不僅僅是course_id?

+0

您需要創建關聯/關係,並且類型取決於您的數據模型。一對一,一對多等等...... – doublesharp

+0

所以如果有很多課程並且每個課程只能有一個課程名稱,那麼這將是一對多的?它看起來像Course.hasMany(Class,{as:'Classes'})嗎? –

+0

是的,我重新讀你的問題,看到你在做什麼,只是發佈了關係定義/查詢的答案。基本上你有什麼,除了你可能想指定列爲NOT NULL,並且由於它是自動創建的,所以在我們的模型定義中不需要它。續集文檔有很多不足之處。 – doublesharp

回答

1

您需要在ClassCourse型號之間create a relationship。如果您在模型定義中指定underscored: true選項,它將不會使用駱駝大小寫,並且會自動創建Class.course_id列,因此您無需對其定義(對於completed_by_user_id可能也是如此)。

const Class = sequelize.define('class', { 
    class_date: Sequelize.DATE, 
    begin_time: Sequelize.TIME, 
    end_time: Sequelize.TIME, 
    max_capacity: Sequelize.INTEGER, 
    is_published: Sequelize.BOOLEAN, 
    training_facility_id: Sequelize.INTEGER, 
    state_id: Sequelize.INTEGER, 
    registration_deadline: Sequelize.DATE, 

    // this will be auto-created by the relationship 
    // course_id: Sequelize.INTEGER, 

    is_report_60_generated: Sequelize.BOOLEAN, 
    // you probably want a relationship here as well 
    completed_by_user_id: Sequelize.INTEGER 
}, { 
    timestamps: false, 
    freezeTableName: true, 

    // use underscored names 
    underscored: true, 
}) 

const Course = sequelize.define('course', { 
    code: Sequelize.STRING, 
    name: Sequelize.STRING 
}, { 
    timestamps: false, 
    freezeTableName: true, 
    underscored: true, 
}) 

基於數據模型卻彷彿每個Class將要求相關Course與如啓動時間等不同的屬性,所以你會告訴Sequelize每個ClassbelongsTo()一個Course

// tell Sequelize that once course will be assigned to many classes, and it is required (not null) 
Class.belongsTo(Course, { foreignKey: { allowNull: false } }) 

一旦它們與您可以使用include option值指定型號加入到您的主查詢。如果您在關係中使用as,則必須在此處指定它。

// do a joined query using "include" 
Class.findAll({ 
    include: [ 
    { 
     model: Course 
    } 
    ] 
}) 
+0

感謝您的詳細解答,但我收到了這個錯誤:「課程(課程)與班級無關!」 –

+0

D'oh,我複製了一些我的代碼,但我以不同的方式查詢數據。嘗試從兩者中刪除'as'參數,看看它是否可以工作... – doublesharp

+0

從兩者中取得'as',但仍然得到這個:課程與班級無關! –

相關問題