项目堆栈:Express.js,MySQL,Bookshelf.js
我在Bookshelf.js中有一个名为Request的模型。这些请求具有经度和纬度。使用该模型的方法具有经度和纬度。我想查询最接近给定坐标集的50个请求。因此,如果我在MySQL语句中执行此操作,我将使用看起来像这样的查询。
var longitude = ...
var latitude = ...
"SELECT * FROM REQUESTS" +
"WHERE STATE_OF_REQUEST = 'unfulfilled'" +
"ORDER BY SQRT(POW(" + longitude + " - LONGITUDE, 2) + POW(" + latitude + " - LATITUDE, 2))"
但是我不想使用SQL语句来执行此操作。我更愿意使用ORM bookshelf.js。
所以我想知道是否有人帮我提出一些干净的代码来做到这一点。
Request.query(( queryItem) => {
queryItem.limit(max);
queryItem.where('STATE_OF_REQUEST', 'unfulfilled');
queryItem.orderBy("SQRT(POW(" + response[0].location.lng + " - LONGITUDE, 2) + POW(" + response[0].location.lat + "- LATITUDE , 2))");
}).fetchAll().then((models) => {
return callBack ({
success: true,
data: models,
});
});
此代码返回此错误?
Unhandled rejection Error: ER_BAD_FIELD_ERROR: Unknown column 'SQRT(POW(-93.0331135 - LONGITUDE, 2) + POW(41.70712109999999- LATITUDE , 2))' in 'order clause'
答案 0 :(得分:0)
使用Knex的.orderByRaw():
queryItem.orderByRaw("SQRT(POW(" + response[0].location.lng +
" - LONGITUDE, 2) + POW(" + response[0].location.lat +
"- LATITUDE , 2))");
在这种情况下,你并没有完全使用Bookshelf,而是直接访问它使用的查询引擎。这样您就可以访问Knex公开的所有方法,因此每当您在Bookshelf中使用.query
或.where
时,都应该参考Knex的文档。