【问题标题】:Sequelize multi-table OR statement unknown column errorSequelize多表OR语句未知列错误
【发布时间】: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


    【解决方案1】:

    我不确定如何修改 companiesUsersParams 的 Sequelize 代码,但您的最终查询应如下所示以获得所需的输出。这可能有助于您重写 Sequelize 代码。

    1. 用户的左联接而不是内部联接。
    2. 您应该将最后一个 OR 选项 usersSecondaryEmails.email LIKE '%bob%' 移动到 UsersSecondaryEmails 加入条件
    3. 在 where 子句中,检查条件(用户表或用户 ID 的 usersSecondaryEmails 中至少应存在一行)

      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 ASupdatedAt, 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 LEFT OUTER JOIN Users AS user ---- #1 ON companiesUsers.user_id = user.id AND (user.first_name LIKE '%bob%' OR user.last_name LIKE '%bob%' OR user.email LIKE '%bob%' OR) LEFT OUTER JOIN UsersSecondaryEmails AS user->usersSecondaryEmails ON companiesUsers.user_id = user->usersSecondaryEmails.user_id AND user->usersSecondaryEmails.email LIKE '%bob%' ---- #2 WHERE companiesUsers.company_id = '1' AND companiesUsers.role_id = 20 AND (user.email is Not null OR user->usersSecondaryEmails.user_id is Not Null); ---- #3

    【讨论】:

    • 我仍然遇到同样的错误。我的语法对这一行是否正确:usersSecondaryEmails.email LIKE '%bob%'
    • 将其更新为 `user->usersSecondaryEmails.email LIKE '%bob%''
    • 查询成功返回,但是有一些问题。 1) 如果在任何字段中都找不到 LIKE 语句,我不想​​返回任何结果。 2) 当用户只有一个匹配的辅助邮箱时,查询失败。
    • 将最后一个连接更改为 INNER JOIN 似乎可以解决它。但是,现在它只返回匹配的辅助电子邮件,而不是在至少有一个匹配时返回所有电子邮件。有没有办法做到这一点?
    • 不保持左外连接不变,将ON中的第一个条件更新为ON companiesUsers.user_id = user->usersSecondaryEmails.user_id
    猜你喜欢
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    相关资源
    最近更新 更多