project stack:express.js,mysql,bookshelf.js
我在bookshelf.js中有一个称为请求的模型。这些请求具有经度和纬度。使用此模型的方法具有经度和纬度。我想对最接近给定的坐标集的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。
http://bookshelfjs.org
所以我想知道是否有人帮助我提出一些干净的代码来做到这一点。
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'
使用knex:
的使用.order.orderbyraw((queryItem.orderByRaw("SQRT(POW(" + response[0].location.lng +
" - LONGITUDE, 2) + POW(" + response[0].location.lat +
"- LATITUDE , 2))");
在这种情况下,您并不完全使用书架,而是访问直接使用的查询引擎。这样,您可以访问KNEX暴露的所有方法,因此每当您在书架中使用.query
或.where
时,都应参考KNEX的文档。