Sequelize,Statement(where)中的语句(where)

4
我已经尝试了两个小时来解决一个微不足道的问题,但它并不是一个问题。我正在使用生成的 yeoman Angular-fullstack 应用程序。
我想使用 Sequelize 编写这段代码:
SELECT * 
FROM demand 
WHERE city_id NOT IN (
SELECT city_id
FROM demand
WHERE user_id=req.params.user_id)

我有以下代码,但它不起作用。我只得到 []
export function getCity(req, res) {
  return Demand.findAll({
    where: {
      city_id:{ $notIn: Demand.findAll({
        attributes: ['city_id'],
        where: {
          user_id: req.params.user_id,
        }
      })}
    }
  })
  .then(handleEntityNotFound(res))
  .then(respondWithResult(res))
  .catch(handleError(res));
}

你有线索吗? 谢谢。
3个回答

3

您第一个查询的问题是因为Sequelize的findall方法返回了一个promise。

在Sequelize中,使用子查询作为where条件的唯一方法是通过literal方法:sequelize.literal('your query');

查看此问题以获取更多信息:https://github.com/sequelize/sequelize/issues/3961


1
我还没有找到一个好的解决方案:最终我使用了查询语句来编写。
export function showDemandArtistNoUser(req, res) {
  return db.sequelize.query('SELECT * FROM demands WHERE city_id NOT IN (SELECT city_id FROM demands WHERE user_id='+req.params.user_id+')', { type: db.sequelize.QueryTypes.SELECT })
  .then(handleEntityNotFound(res))
  .then(respondWithResult(res))
  .catch(handleError(res));
}

使用我的angular-fullstack,我需要在页面上添加以下内容:

 import db from '../../sqldb';

1
我在我的项目中遇到了类似的问题。 我选择实现方式有两个不同的原因:
  1. 如果 Sequelize 在某个时间点决定实现子查询-语法已经准备好了。
  2. 使用 Sequelize 防止 SQL 注入。
这是我的代码片段,希望对你有所帮助。
const tempSQL = sequelize.dialect.QueryGenerator.selectQuery('MyOtherTable',{
    attributes: ['fkey'],
    where: {
         field1: 1,
         field2: 2,
         field3: 3
    }})
    .slice(0,-1); // to remove the ';' from the end of the SQL

MyTable.find( {
    where: {
        id: {
             $notIn: sequelize.literal('(' + tempSQL + ')'),
        }
    } 
} );

有些人可能选择不使用tempSQL变量,而是在find结构内部构建SQL(也许使用帮助方法?)
我认为这也可能是sequelize的子查询扩展的基础,因为它几乎使用相同的语法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接