Sequelize - 使用 MariaDB 的 where 子句中的地理位置

Posted

技术标签:

【中文标题】Sequelize - 使用 MariaDB 的 where 子句中的地理位置【英文标题】:Squelize - geolocation in where clauses using MariaDB 【发布时间】:2014-07-13 01:20:27 【问题描述】:

我有一个使用 MariaDB 的 node.js 应用程序。 到目前为止,我所有的 SQL 都在存储过程中。

我正在考虑 Sequelize,我唯一没有在其中找到的东西——我需要的——是在 where 子句中使用函数。

我当前的查询中有类似的内容:

Select * from places p
where ST_WITHIN(p.geolocation, ST_BUFFER(GeomFromText(in_geolocation), radius)) = 1

(in_gelocation 和 radius 是 SP 参数)。

在 Sequelize 或其他 ORM 中是否可以这样做?

谢谢

【问题讨论】:

【参考方案1】:

尝试使用Sequelize.fn

创建一个表示数据库函数的对象。这可以用于 搜索查询,在 where 和 order 部分,并作为默认值 在列定义中。

http://docs.sequelizejs.com/en/latest/api/sequelize/#fn-fn-args-sequelizefn

【讨论】:

【参考方案2】:

这是一个 Sequelize 地理定位示例供您参考。它利用 SQL 函数并说明了 where 属性的包含。

if(!query.includes(',') && lat && lng) 
    attributes.push([
        DataTypes.fn('concat',
        DataTypes.col('city'),
        DataTypes.col('state')
    ),'city_state'])
    attributes.push([
        DataTypes.fn('ST_Distance',
        DataTypes.col('location'),
        DataTypes.literal(`ST_GeomFromText('POINT($lat $lng)', 4326)`)
    ), 'distance'])

if(!query.includes(',')) 
    attributes.push([DataTypes.literal(`CASE
        WHEN
            name = '` + query + `' THEN 4
        WHEN
            city LIKE '%` + query + `%' THEN 3
        WHEN
            name LIKE '%` + query + `%' THEN 2
        WHEN
            name LIKE '` + query + `%' THEN 1
    END`), 'exact_like_match'])

var whereAnd = []
whereAnd.push(
    DataTypes.literal('MATCH(name, city, state, zip) AGAINST(:search_query)')
)
whereAnd.push(
    menu_enabled: 'Y'
)
var search_params =    
    where: whereAnd,
    replacements: 
        search_query: '+' + query + '*',
        type: DataTypes.QueryTypes.SELECT
    ,
    attributes: attributes,
    offset: parseInt(req.query.start),
    limit: req.query.limit ? parseInt(req.query.limit) : 12

search_params['order'] = [
    DataTypes.literal('exact_like_match DESC')
]
if(!query.includes(',')) 
    // console.log('comma detected!')
    search_params['order'] = [
        DataTypes.literal('exact_like_match DESC, distance ASC')
    ]

dispensary.findAndCountAll(search_params).then(disp_rx => 

)

【讨论】:

以上是关于Sequelize - 使用 MariaDB 的 where 子句中的地理位置的主要内容,如果未能解决你的问题,请参考以下文章

MariaDB 的 Sequelize 错误

尝试使用 sequelize 创建迁移时出错

sequelize 中文教程

与 Sequelize 的交易不起作用

[转]在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查

可适用于node.js的十大数据库类