我怎样才能实现这个SQL QUERY的sequelize(多个连接和多个AND / OR)

我一直在努力实现这个(在SQL语句下面)在sequelize一段时间没有运气。 我最初不得不做单独的sequelize查询来获取数据,但这只是提出了很多限制。

`SELECT "Documents".* FROM "Documents" INNER JOIN "AccessTypes" ON "AccessTypes"."id" = "Documents"."accessTypeId" INNER JOIN "Users" ON "Users"."id" = "Documents"."userId" INNER JOIN "Departments" ON "Departments"."id" = "Users"."departmentId" WHERE (("AccessTypes".name != 'private' AND "Departments"."id" = ${req.decoded.departmentId}) OR "Users".id = ${req.decoded.id}) AND ("Documents"."title" ILIKE '%${searchQuery}%' OR "Documents"."content" ILIKE '%${searchQuery}%'` 

这是我得到的

  var dbQuery = { where: { $or: [ { title: { $iLike: `%${searchQuery}%` } }, { content: { $iLike: `%${searchQuery}%` } } ] }, include: [{ model: db.Users, where: { departmentId: req.decoded.departmentId } }, { model: db.AccessTypes, where: { name: { $ne: 'private'}} }] }; db.Documents.findAll(dbQuery) 

我仍然需要根据提供的userId获取另一组文档。 我觉得要走的路是在'$或'声明中执行'包含'。 但是,迄今为止,我的研究使我相信这是不可能的。

这里是我的模型访问types

 export default (sequelize, DataTypes) => { const AccessTypes = sequelize.define('AccessTypes', { name: { type: DataTypes.STRING, allowNull: false, isUnique: true } }, { classMethods: { associate: (models) => { // associations can be defined here AccessTypes.hasMany(models.Documents, { foreignKey: 'accessTypeId', onDelete: 'CASCADE' }); } } }); return AccessTypes; }; 

用户

 export default (sequelize, DataTypes) => { const Users = sequelize.define('Users', { username: { type: DataTypes.STRING, unique: true, allowNull: false }, firstname: { type: DataTypes.STRING, allowNull: false }, lastname: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, unique: true, allowNull: false, validate: { isEmail: true } }, password: { type: DataTypes.STRING, allowNull: false }, roleId: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 3 }, departmentId: { type: DataTypes.INTEGER, allowNull: false } }, { classMethods: { associate: (models) => { // associations defined here Users.belongsTo(models.Roles, { onDelete: 'CASCADE', foreignKey: 'roleId' }); Users.belongsTo(models.Departments, { onDelete: 'CASCADE', foreignKey: 'departmentId' }); Users.hasMany(models.Documents, { as: 'documents', foreignKey: 'userId', onDelete: 'CASCADE' }); } }, ... 

部门

 export default (sequelize, DataTypes) => { const Departments = sequelize.define('Departments', { name: { type: DataTypes.STRING, allowNull: false, isUnique: true } }, { classMethods: { associate: (models) => { // associations can be defined here Departments.hasMany(models.Users, { foreignKey: 'departmentId', onDelete: 'CASCADE' }); } } }); return Departments; }; 

和文件

 export default (sequelize, DataTypes) => { const Documents = sequelize.define('Documents', { title: { type: DataTypes.STRING, allowNull: false }, content: { type: DataTypes.TEXT, allowNull: false }, userId: { type: DataTypes.INTEGER, allowNull: false }, accessTypeId: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 1 }, docTypeId: { type: DataTypes.INTEGER, allowNull: false } }, { classMethods: { associate: (models) => { // associations can be defined here Documents.belongsTo(models.Users, { foreignKey: 'userId', as: 'user', onDelete: 'CASCADE' }); Documents.belongsTo(models.DocumentTypes, { foreignKey: 'docTypeId', onDelete: 'CASCADE' }); Documents.belongsTo(models.AccessTypes, { foreignKey: 'accessTypeId', onDelete: 'CASCADE' }); } } }); return Documents; }; 

任何指针将不胜感激在此先感谢

这是相当复杂的查询(当然是Sequelize方式),所以你需要以不同的方式构build它。 你应该使用sequelize.col()sequelize.where()sequelize.or()sequelize.and()sequelize.and() 。 此外,为了在查询中包含Departments模型,您需要在findAll查询的options对象中使用嵌套的include语句。 您可以尽可能多地嵌套包含。

 where: sequelize.and( sequelize.or( sequelize.and( sequelize.where(sequelize.col('AccessTypes.name'), '!=', 'private'), sequelize.where(sequelize.col('Departments.id'), '=', req.decoded.departmentId) ), sequelize.where(sequelize.col('Users.id'), '=', req.decoded.id) ), sequelize.or( { title: { $iLike: `%${searchQuery}%` } }, { content: { $iLike: `%{searchQuery}%` } } ) ), include: [ { model: db.Users, include: [ db.Departments ] }, { model: db.AccessTypes } ] 

你需要简单地通过上述function的文件。 简而言之, col()根据模型名和字段创build适当的列select, where()使用三个属性 – 列,条件(比较器)和逻辑创buildWHERE语句, or()创buildOR语句和and()创buildAND语句。 or()and()都可以获得多个参数,使您可以创build复杂的语句,就像您的一样。