【问题标题】:How to perform raw PostGIS queries with includes using sequelize如何使用包含使用 sequelize 执行原始 PostGIS 查询
【发布时间】:2017-03-23 22:14:44
【问题描述】:

尝试使用 sequelize 内置的 ORM 便利包括带有原始 PostGIS 查询的语法。

这个调用正确地加入了相关的promotionImage和category表,就像我需要的那样,但它不会像我需要的那样对我的数据库进行地理查询:

  promotion.findAll({
    include: [{
      model: promotionImage
    }, {
      model: category
    }]
  }).then(promoters => {
    res.json(promoters)
  }).catch(err => {
    console.log('ERROR: ', err)
  })

另一方面,此查询在提供的 lat/lng 范围内正确找到了“促销”,但它没有正确连接关联的promotionImage 和类别表:

    const query = '\
      SELECT * \
      FROM "promotions" \
      WHERE "promotions"."location" && ST_MakeEnvelope(:southWestLng, :southWestLat, :northEastLng, :northEastLat)'
    replacements = {
      southWestLng, 
      southWestLat, 
      northEastLng, 
      northEastLat
    }

  db.sequelize.query(query, {
    replacements,
    type: sequelize.QueryTypes.SELECT,
    model: promotion,
    include: [{
      model: promotionImage
    }, {
      model: category
    }]
  }).then(promoters => {
    res.json(promoters)
  }).catch(err => {
    console.log('ERROR: ', err)
  })

有没有办法既使用ST_MakeEnvelope 语法进行查询,又使用 sequelize 和 postGIS 包含来自其他模型的数据?

【问题讨论】:

    标签: node.js postgresql sequelize.js postgis


    【解决方案1】:

    Sequelize.query()不支持include,你可以使用Sequelize.fn()findAll

     promotion.findAll({
        where: {
           location: {
               $overlap: db.sequelize.fn('ST_MakeEnvelope', southWestLng, southWestLat, northEastLng, northEastLat)
           }
        },
        include: [{
          model: promotionImage
        }, {
          model: category
        }]
      }).then(promoters => {
        res.json(promoters)
      }).catch(err => {
        console.log('ERROR: ', err)
      })
    

    【讨论】:

    • 看来你的回答让我非常接近。但它没有返回任何结果。我认为问题在于 postGIS 查询不应该有= 符号,而是&&。所以你的答案格式化了查询:WHERE "promotion"."location" = ST_MakeEnvelope(... 当它应该是:WHERE "promotions"."location" && ST_MakeEnvelope(...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2016-05-10
    • 2017-04-08
    相关资源
    最近更新 更多