mysql搜索子&在nodejs中使用sequelize的父表字段

时间:2017-02-14 16:04:33

标签: mysql node.js sequelize.js

在我的Node申请中,我们使用Sequelizemysql建立联系 有两张表User& UserOption

User表有以下字段

user_id(pk)
user_email

UserOption表有以下字段

option_id(pk)
user_id(fk)
first_name

我需要按user_email&中的搜索文字列出所有用户first_name 是否有任何选项可以同时搜索父母& Sequelize中的子表格字段?

更新

User

user_id  user_email
1          text@text.com
2          anything@anything.com
3          jhon@smthng.com

UserOption

option_id   user_id  first_name
1             1        jhon
2             2        smith
3             3        david

如果我搜索" jhon",结果将是id为1和2的用户

1 个答案:

答案 0 :(得分:1)

您需要include模型UserOption查找模型User。这将生成条件为JOIN的{​​{1}}子句,并添加指定的UserOption.user_id = User.user_id子句以对两个表的WHEREuser_email列执行文本查找

first_name

修改

根据您更新的问题,我认为您可以尝试使用sequelize.literal方法,但是,根据文档:

  

创建一个表示文字的对象,即不会被转义的东西。

因此有必要自己逃避所需的值

User.findAll({
    where: {
        user_email: { $like: '%text%' }
    },
    include: [
        {
            model: UserOption,
            where: {
                first_name: { $like: '%text%' }
            },
            attributes: []
        }
    ]
}).then((users) => {
    // result
});

它会生成一个查询,从let escValue = sequelize.escape(lookupText); User.findAll({ where: { $or: [ { email: { $like: '%' + lookupText + '%' }, { id: { $in: sequelize.literal(`(SELECT uo.user_id FROM user_options uo WHERE uo.first_name LIKE CONCAT('%', ${escValue}, '%'))`) } ] } }).then((users) => { // result... }); 表中选择usersemail LIKE '%text%'位于指定查询结果中的用户。

如果满足您的需求,我很好奇,等待反馈。