NodeJS 如何在Sequalize中搜索关联中的多个字段?

krcsximq  于 2023-06-29  发布在  Node.js
关注(0)|答案(1)|浏览(131)

我正在为电子商务项目的订单搜索功能。我需要搜索订单ID和order.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)

我需要搜索order.id或order.user.name

这是我目前得到的:

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' 
                }]
            })

我不断重复的错误是:
缺少表“user”的FROM-clause条目

更新日期:
问题解决了。

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'
                }]
            })
kmbjn2e3

kmbjn2e31#

可以将where子句添加到include本身。

const orders = await models.Order.findAll({
            where: {id: idYouLookFor},
            include: [{
                model: models.User,
                as: 'user',
                where: { name: "nameYouLookFor" }
            }]
        })

这将返回所有与两个子句都匹配的用户连接的订单。

相关问题