mysql在nodejs中search子节点和父节点表字段
在我的Node
应用程序中,我们使用Sequelize
来连接mysql
有两个表User
& UserOption
User
表有以下字段
user_id(pk) user_email
UserOption
表有以下字段
option_id(pk) user_id(fk) first_name
我需要通过search文本在user_email
& first_name
列出所有用户是否有任何选项在user_email
中search父&子表格字段?
UPDATE
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
如果我search“jhon”,结果将是id为1和2的用户
您需要在模型User
中查找include
模型UserOption
。 这将生成一个条件为UserOption.user_id = User.user_id
的JOIN
子句,并添加指定的WHERE
子句以在两个表的user_email
和first_name
列上执行文本查找
User.findAll({ where: { user_email: { $like: '%text%' } }, include: [ { model: UserOption, where: { first_name: { $like: '%text%' } }, attributes: [] } ] }).then((users) => { // result });
编辑
基于你更新的问题,我认为你可以尝试使用sequelize.literal
方法,但根据文档:
创build一个表示文字的对象,即不会被转义的东西。
所以有必要自己逃避所需的价值
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... });
它将生成一个查询,从users
表中select用户email LIKE '%text%'
或其中users.id
位于指定查询结果中的users
表。
我很好奇,如果这符合您的需求,等待反馈。