Javascript 如何在sequelize中实现此SQL查询(多个联接和多个和/或)

Javascript 如何在sequelize中实现此SQL查询(多个联接和多个和/或),javascript,node.js,postgresql,sequelize.js,Javascript,Node.js,Postgresql,Sequelize.js,我在sequelize中努力实现这一点(在SQL语句下面)已经有一段时间了,但运气不好。最初,我不得不进行单独的sequelize查询以获取数据,但这带来了许多限制 `SELECT "Documents".* FROM "Documents" INNER JOIN "AccessTypes" ON "AccessTypes"."id" = "Documents"."accessTypeId" INNER JOIN "Users" ON "Users"."id" =

我在sequelize中努力实现这一点(在SQL语句下面)已经有一段时间了,但运气不好。最初,我不得不进行单独的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获取另一组文档。我觉得应该在“$or”语句中执行“Include”。然而,到目前为止,我的研究使我相信这是不可能的

这是我的模型 访问类型

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 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;
};
任何指点都将不胜感激
提前感谢

这是一个非常复杂的查询(当然是以续集的方式),所以您需要以不同的方式构建它。您应该使用诸如和之类的函数。此外,为了在查询中包含
部门
模型,您需要在
findAll
查询的选项对象中使用嵌套的
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
    }
]

您需要简要阅读上述函数的文档。简而言之,
col()
根据模型名称和字段创建适当的列选择,
where()
使用三个属性创建
where
语句-列、条件(比较器)和逻辑,
or()
创建
语句和
创建
语句。
或()。虽然我还没有应用它,但我相信它会起作用。谢谢,洛蒂能用这个。工作得很有魅力再次感谢
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
    }
]