2016-11-10 72 views
0

尝试使用内置ORM便利性的sequelize包括具有原始PostGIS查询的语法。如何使用sequelize执行原始PostGIS查询使用包括

此调用正确联接相关promotionImage和类别表只是因为我需要它,但它并不地理查询我的数据库就像我需要它:正确

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

在另一方面,这种查询发现所提供的纬度/经度范围内的“促销活动”,但它不能正常参加相关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?

回答

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

它看起来像你的回答让我很接近。但它没有返回任何结果。我认为问题在于postGIS查询不应该有'='符号,而是'&&'。所以你的答案格式化查询:'WHERE“promotion”。“location”= ST_MakeEnvelope(...'当它应该是:WHERE“promotions”。“location”&& ST_MakeEnvelope(...' – Scott

+1

我错过了,我编辑了我的答案@Scott –