2014-02-27 18 views
10

Ich arbeite an einem persönlichen Projekt, um Node.js + express + Bookshelf.js zu lernen. Wo erstelle ich Abfragen? Wie setze ich einfach einen 'ORDER BY' oder 'WHERE' in den folgenden Code?Sortiere Bookshelf.js mit .OrderBy()

var Accounts = require('../collections/accounts').collection; 

new Accounts().fetch({ 
    withRelated: ['folders'] 
}).then(function(collection) { 
    // process results 
}); 

Ich möchte Bookshelf.js lernen, weil es um die Funktionen zu bieten scheint, ich bin es gewohnt, mit Laravel der Elequent (PHP), wie polymorphe Beziehungen und Unterausdrücke. Ich stelle jedoch fest, dass die Dokumentation nicht sehr detailliert ist und der Versuch, Beispiele zu finden, nahezu unmöglich ist.

Vielen Dank im Voraus für jede Hilfe.

Robin

+0

Wenn Sie SQL-Code schreiben möchten, warum verwenden Sie ORM? [node-mysql] (https://github.com/felixge/node-mysql) und ähnliche Bibliotheken würden besser passen. – alex

+0

Vielen Dank für den Kommentar und den Vorschlag. Ich würde es gerne vermeiden, reinen MySQL-Code zu schreiben. Ich werde diese Bibliothek überprüfen. – user1094128

Antwort

12

Ah gerade gefunden die Antwort auf meine Frage.

Wie die Website bookshelf.js sagt, wird der Abfrage-Generator von knex.js verwendet. Um meine Sammlung zu sortieren, habe ich Folgendes getan:

var Accounts = require('../collections/accounts').collection 

new Accounts().query(function(qb){ 
    qb.orderBy('name','DESC'); 
}).fetch({ 

}).then(function(collection){ 
    // process results 
}); 

... was super funktioniert!

10

können Sie auch tun einfach

var Accounts = require('../collections/accounts').collection; 

new Accounts().query('orderBy', 'columnname', 'asc').fetch({ 
    withRelated: ['folders'] 
}).then(function(collection) { 
    // process results 
}); 

ohne auf den Query Builder zu bekommen.

10

Ich weiß, das ist ein alter Beitrag, aber hier ist meine Sicht darauf. BookshelfJS ist erstaunlich, aber es fehlen einige einfache Funktionen. Also habe ich mein eigenes Basismodell namens Closet erstellt.

Für orderBy, ist es das, was Closet wie folgt aussieht:

var Closet = DB.Model.extend({ 

    /** 
    * Orders the query by column in order 
    * @param column 
    * @param order 
    */ 
    orderBy: function (column, order) { 
     return this.query(function (qb) { 
      qb.orderBy(column, order); 
     }); 
    } 
}); 

Meine anderen Modelle Closet statt Bookshelf.Model aufwenden. Dann können Sie direkt verwenden orderBy:

new Accounts() 
    .orderBy('name', 'DESC') 
    .fetch() 
    .then(function(collection){ 
     // process results 
    }); 
+0

kann dies für mehrere Aufträge durchgeführt werden, wenn die orderBy-Felder nicht auf API-Basis festgelegt sind ..? – atjoshi