如何在Sequelize中用同一搜索词查询发票及关联公司数据?
发票多条件或逻辑查询实现方案
你的问题核心是当前代码将发票自身条件和关联公司条件拆成独立过滤,导致实际是且逻辑而非预期的或逻辑。要实现「匹配发票serialCode 或 匹配关联ForeignCompany的companyName」,需要把两个条件合并到同一个顶层Op.or中,同时正确引用关联表字段。
修改后的代码
const allInvoices = await Invoice.findAll({ where: { userId: userId, [Op.or]: [ // 匹配发票自身的序列号 { serialCode: { [Op.like]: `%${searchPhrase}%` } }, // 匹配关联的ForeignCompany的公司名称 Sequelize.where(Sequelize.col('ForeignCompany.companyName'), { [Op.like]: `%${searchPhrase}%` }) ] }, include: [ { model: Company, as: "UserCompany" }, { model: Company, as: "ForeignCompany", required: false // 允许发票无关联ForeignCompany时,仍能通过serialCode匹配被返回(左连接) }, User, Country, Currency, ], order: [["createdAt", "DESC"]], });
关键调整说明
- 合并OR条件:将两个搜索逻辑放到同一个
Op.or数组中,确保SQL生成的是(serialCode LIKE ...) OR (ForeignCompany.companyName LIKE ...)的或逻辑。 - 正确引用关联字段:用
Sequelize.col('ForeignCompany.companyName')明确指定关联表的字段,避免Sequelize解析错误。也可以用简写方式{ '$ForeignCompany.companyName$': { [Op.like]:%${searchPhrase}%} },但Sequelize.col更规范安全。 - 关联表连接类型:设置
required: false表示左连接,这样即使发票没有关联的ForeignCompany,只要serialCode匹配就会被查询出来;如果业务要求发票必须有ForeignCompany,可去掉该参数(默认内连接)。
内容的提问来源于stack exchange,提问作者justelio19
相关产品推荐
相关产品推荐

