如何使用 sequelize 执行原始 PostGIS 查询

How to perform raw PostGIS queries with includes using sequelize

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

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

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

另一方面,此查询在提供的 lat/lng 范围内正确找到了 "promotions",但它没有正确加入关联的 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 包含来自其他模型的数据?

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)
  })