Sequelize 关联查询时父表和子表的OR关系查询

关联查询时父表和子表的OR关系查询

问题描述:

假如我有一个搜索, 传入一个关键字, 便可以按照父表的设备名称搜索, 也能够按照子表的设备所在的房间名称搜索. 第一想法我会这样写javascript

Device.findAll({
  where: {
      $or: [
        { device_name: keyword },
        { 'room.room_name': keyword }
      ]
  },
  include: [{
    model: Room,
  }]
})
复制代码

这时候应该会报错 SequelizeDatabaseError: column Device.room.room_name does not existjava

其实问题的关键就是在外层的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',
    });
复制代码
相关文章
相关标签/搜索