如何最好地使用Bookshelf.js的SQL别名

时间:2018-04-03 02:34:53

标签: mysql node.js express bookshelf.js

项目堆栈: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。

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'

1 个答案:

答案 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的文档。