【发布时间】:2018-12-17 16:27:00
【问题描述】:
我正在尝试对我的模型进行搜索,我想获取电子邮件、名字或姓氏与搜索字符串类似,或者 UsersSecondaryEmails 表(相关模型)包含类似电子邮件的所有用户字符串。
由于 OR 语句的部分在不同的表中,这有点棘手,我只能找到其他 StackOverflow 答案来帮助我。
这是我的查询(简化):
const companiesUsersParams = {
where: {
companyId: req.params.companyId,
roleId: role.id
},
include: [{
model: models.Users,
attributes: ['id', 'firstName', 'lastName', 'email'],
where: req.query.s ? {
[Op.or]: [{
firstName: {
[Op.like]: `%${req.query.s}%`
}
}, {
lastName: {
[Op.like]: `%${req.query.s}%`
}
}, {
email: {
[Op.like]: `%${req.query.s}%`
}
}, {
'$usersSecondaryEmails.email$': {
[Op.like]: `%${req.query.s}%`
}
}]
} : null,
include: [{
model: models.UsersSecondaryEmails,
attributes: ['id', 'email'],
as: 'usersSecondaryEmails'
}]
}]
}
当 req.query.s 未定义时,查询会按预期运行(无 OR 语句),所以我知道这不是我的关联问题。
当我在定义 req.query.s 的情况下运行此查询时,我得到
“on 子句”中的未知列“usersSecondaryEmails.email”
这是正在生成的 SQL(格式尽可能好):
SELECT `companiesUsers`.`id`,
`companiesUsers`.`company_id` AS `companyId`,
`companiesUsers`.`user_id` AS `userId`,
`companiesUsers`.`role_id` AS `roleId`,
`companiesUsers`.`created_at` AS `createdAt`,
`companiesUsers`.`updated_at` AS`updatedAt`,
`user`.`id` AS `user.id`,
`user`.`first_name` AS `user.firstName`,
`user`.`last_name` AS `user.lastName`,
`user`.`email` AS `user.email`,
`user->usersSecondaryEmails`.`id` AS `user.usersSecondaryEmails.id`,
`user->usersSecondaryEmails`.`email` AS
`user.usersSecondaryEmails.email`
FROM `CompaniesUsers` AS `companiesUsers`
INNER JOIN `Users` AS `user`
ON `companiesUsers`.`user_id` = `user`.`id` AND
(`user`.`first_name` LIKE '%bob%' OR
`user`.`last_name` LIKE '%bob%' OR
`user`.`email` LIKE '%bob%' OR
`usersSecondaryEmails`.`email` LIKE '%bob%')
LEFT OUTER JOIN `UsersSecondaryEmails` AS `user->usersSecondaryEmails`
ON `user`.`id` = `user->usersSecondaryEmails`.`user_id`
WHERE `companiesUsers`.`company_id` = '1'
AND `companiesUsers`.`role_id` = 20;
任何关于 Sequelize 中的多表 OR 语句的文档的建议或链接都会很棒(我在文档中找不到这么高级的东西)。
【问题讨论】:
标签: mysql sql node.js sequelize.js