sequelize,声明(where)在声明中(where)

时间:2016-08-10 19:42:10

标签: javascript angularjs node.js sequelize.js angular-fullstack

我正在尝试2个小时来解决一个不是一个问题。 我正在使用生成的yeoman Angular-fullstack App。

我想用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 个答案:

答案 0 :(得分:3)

第一个查询的问题就在那里,因为sequelize的findall方法返回一个promise。

在sequelize条件中使用子查询的唯一方法是通过文字方法:sequelize.literal('your query');

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

答案 1 :(得分:2)

我还没有找到一个很好的解决方案:我终于用查询写了。

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';

答案 2 :(得分:1)

我在项目中遇到过类似的问题。 我选择实现它的方式有点不同有两个原因:

  1. 如果在某个时间点Sequelize决定实施子查询 - 语法就绪。
  2. 再次使用Sequelize保护SQL注入。
  3. 这是我的代码段,希望它有所帮助。

    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的子查询扩展的基础,因为它几乎使用相同的语法。