【问题标题】:sequelize, Statement(where) in statement(where)sequelize, Statement(where) in statement(where)
【发布时间】:2016-12-17 08:32:31
【问题描述】:

我尝试了 2 个小时来解决一个不是问题的小问题。 我正在使用生成的 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));
}

你有线索吗? 谢谢。

【问题讨论】:

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


    【解决方案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';
    

    【讨论】:

      【解决方案2】:

      您的第一个查询存在问题,因为 sequelize 的 findall 方法返回了一个承诺。

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

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

      【讨论】:

        【解决方案3】:

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

        1. 如果 Sequelize 在某个时间点决定实施子查询 - 语法已准备就绪。
        2. 对 SQL 注入使用 Sequelize 保护。

        这是我的代码 sn-p,希望对您有所帮助。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-12
          • 2012-04-15
          • 1970-01-01
          • 2012-08-18
          • 2022-12-01
          • 2011-10-05
          • 1970-01-01
          • 2022-12-26
          相关资源
          最近更新 更多