Sequelize:父where子句和子句

时间:2017-08-01 09:11:25

标签: node.js sequelize.js

我有2个型号:

const User = sequelize.define('User', {
    email: {
        type: DataTypes.STRING,
    },
    password: {
        type: DataTypes.STRING,
    },
});
User.associate = (models) => {
    User.hasOne(models.Profile, {
        foreignKey: {
            name: 'user_id',
        },
    });
};

const Profile = sequelize.define('Profile', {
    name: {
        type: DataTypes.STRING,
    },
    avatar: {
        type: DataTypes.STRING,
    },
}, {
    tableName: 'profiles',
    freezeTableName: true,
    timestamps: false,
});

Profile.associate = (models) => {
    Profile.belongsTo(models.User, {
        foreignKey: {
            name: 'user_id',
        },
    });
};

我想让电子邮件地址或名称符合特定条件的所有用户。类似的东西:

User
    .all({
        where: {
            email: {
                $like: filter
            },
        },
        include: [{
            model: Profile,
            where: {
                name: {
                    $like: filter
                },
            },
        }],
    })
    .then(users => res.status(200).send(users))
    .catch(error => {
        return res.sendStatus(500);
    });

但它返回user.email和profile.name匹配条件的所有用户。我想在2 where子句之间进行OR。

有可能吗?

注意: 我正在使用Sequelize 4.0.0。

更新: 如果其他人在努力解决这个问题,那么解决方案就是:

User
    .all({
        where: {
            $or: {
                email: {
                    $like: filter
                },
                '$Profile.name$': {
                    $like: filter
                }
            }
        },
        include: [{
            model: Profile,
        }],
    })
    .then(users => res.status(200).send(users))
    .catch(error => {
        return res.sendStatus(500);
    });

1 个答案:

答案 0 :(得分:3)

如果有其他人在寻找这个,我就是这样设法解决的:

User
    .all({
        where: {
            $or: {
                email: {
                    $like: filter
                },
                '$Profile.name$': {
                    $like: filter
                }
            }
        },
        include: [{
            model: Profile,
        }],
    })
    .then(users => res.status(200).send(users))
    .catch(error => {
        return res.sendStatus(500);
    });

感谢@Ninja Coding确认解决方案。