假如我有一個搜索, 傳入一個關鍵字, 便可以按照父表的設備名稱搜索, 也能夠按照子表的設備所在的房間名稱搜索. 第一想法我會這樣寫javascript
Device.findAll({
where: {
$or: [
{ device_name: keyword },
{ 'room.room_name': keyword }
]
},
include: [{
model: Room,
}]
})
複製代碼
這時候應該會報錯 SequelizeDatabaseError: column Device.room.room_name does not exist
java
其實問題的關鍵就是在外層的where怎麼使用子表的column的問題:git
參考連接: 傳送門github
Device.findAll({
where: {
$or: [
{ device_name: keyword },
sequelize.where(sequelize.col('room.room_name'), 'ILIKE', `%${keyword}%`),
]
},
include: [{
model: Room,
}]
})
複製代碼
參考連接: 傳送門bash
Device.findAll({
where: {
$or: [
{ device_name: keyword },
{ '$room.room_name$': keyword }
]
},
include: [{
model: Room,
as: 'room',
}]
})
複製代碼
這個方法的關鍵是 $$
中間可使用關聯名稱, 因此關聯的時候使用asapp
app.model.Home.hasOne(app.model.VrHomeInfo, {
foreignKey: 'home_id',
constraints: false,
scope: app.Sequelize.where(app.Sequelize.col('vr_home_info.client_id'), '=', app.Sequelize.col('home.client_id')),
as: 'vr_home_info',
});
複製代碼