问题
I want to achieve this
SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;
from https://developers.google.com/maps/articles/phpsqlsearch_v3?hl=fr#createtable
How can I make this query with Bookshelf.
I have this now:
var raw = '( 3959 * acos( cos( radians(37) ) * cos( radians( '+ req.params.lat + ' ) ) * cos( radians( '+req.params.lng+' ) - radians(-122) ) + sin( radians(37) ) * sin( radians( '+req.body.lng+' ) ) ) ) AS distance';
new Places().query(function(qb) {
qb.where('lat',req.params.lat);
qb.where('lng',req.params.lng);
qb.column(raw);
qb.having('distance', '>', 25);
}).fetch({ debug: false }).then(function(collection) {
console.log(collection);
if (collection === undefined) {
// no such result
res.json(404,{error: "No Places found."});
} else {
// found, list json
res.json(200, collection);
}
});
回答1:
I found this to work .. no qb. instance/reference required:
var Bookshelf = require('bookshelf').mysqlAuth;
var rawSql = 'SELECT .. <etc>';
Bookshelf.knex.raw(rawSql).then(..);
回答2:
Its.
qb.column(qb.knex.raw(raw));
回答3:
i Tried something like this which worked fine
return **Location**.query(qb => {
return ***query***
})
.fetchAll()
.then(data => data.toJSON());
With:
Location is a Model (I am doing it inside strapi services)
query can be any raw query.
来源:https://stackoverflow.com/questions/23952960/how-to-do-raw-query-in-bookshelf-js