如何在Sequelize关联中多字段查询订单ID与用户名称
解决Sequelize关联查询报错:missing FROM-clause entry for table "user"
问题场景
在电商项目开发订单搜索功能,需要根据order.id或关联的user.name进行模糊查询。模型定义及关联代码如下:
const User = sequalize.define("user", { name: {type: DataTypes.STRING(64), allowNull: true}, // 其他字段 }) const Order = sequalize.define("order", { id: {type: DataTypes.STRING, unique: true, allowNull: false, primaryKey: true} }) User.hasMany(Order, {as: "user"}) Order.belongsTo(User)
最初编写的查询代码:
const query = "John" let whereClause = {} if (query) { whereClause = { [Op.or]: [ { id: { [Op.like]: `%${query}%` } }, { '$user.name$': { [Op.like]: `%${query}%` } } ] } } const orders = await models.Order.findAll({ where: whereClause, include: [{ model: models.User, as: 'user' }] })
执行后反复报错:missing FROM-clause entry for table "user"
解决方法
调整后的最终可运行代码:
let whereClause = {} if (search) { whereClause = { [Op.or]: [{ id: { [Op.iLike]: `%${search}%`, }, }, { '$user.name$': { [Op.iLike]: `%${search}%`, }, }, ] } } const orders = await models.Order.findAll({ where: whereClause, include: [{ model: models.User, as: 'user' }] })
关键注意点
- 若使用PostgreSQL,
Op.iLike可实现大小写不敏感的模糊查询;若为MySQL,可继续使用Op.like搭配LOWER()函数实现相同效果。 - 建议修正关联定义,保证
belongsTo的别名与hasMany一致,避免Sequelize生成SQL时找不到关联表:
// 修正后的关联代码 Order.belongsTo(User, { as: 'user' })
内容的提问来源于stack exchange,提问作者Alinur
相关产品推荐
相关产品推荐

