2016-06-07 19 views
0

Ich erstellte eine Sails-Anwendung mit zwei Modellen Veröffentlichung und Arbeitsblatt. Sie haben eine Eins-zu-Eins-Beziehung. Sails-postgresql ist der Adapter, den ich benutze. Ich benutze Waterline Orm, um eine Anfrage an die Datenbank auszulösen. Ich bin, wenn ich versuche, Publikationsdaten zusammen mit Arbeitsblatt zu laden und dann die Datensätze abhängig von einem Feld im Arbeitsblatt mit sort() zu sortieren, bekomme ich einen Fehler.Sortieren besiedelten Datensatz in Segeln Waterline

Mein Modell ist:

Publication.js

module.exports = { 
    attributes: { 
     id: { 
      type: 'integer' 
      unique: true 
     }, 
     worksheetId: { 
      type: 'integer', 
      model : 'worksheet' 
     }, 
     status: { 
      type: 'string', 
      defaultsTo: 'active', 
      in : ['active', 'disabled'], 
     } 
    } 
} 

Worksheet.js

module.exports = { 
    attributes: { 
     id: { 
     type: 'integer', 
     unique: true 
     }, 
     name: 'string', 
     orderWeight: { 
     type: 'integer', 
     defaultsTo: 0 
     } 
    } 
} 

So jetzt habe ich die ganze Publikation laden möchten, wo Status "aktiv" ist und Arbeitsblatt füllen in den Daten.

ich die Ausführung der Abfrage So:

Publication.find({ 
    where: { 
    status: 'active' 
    } 
}) 
.populate('worksheetId').limit(1) 
.exec(function (error, publications) { 
}) 

und ich bin ein Daten wie immer:

{ 
    id : 1, 
    status : "active", 
    worksheetId : { 
     id : 1 
     name : "test", 
     orderWeight : 10 
    } 
} 

So bis jetzt es ist alles gut funktioniert. Jetzt möchte ich das Limit auf 10 erhöhen und die Daten in Abhängigkeit von "orderWeight" sortieren, das in den Daten enthalten ist. Anfangs habe ich die ganzen Daten in Abhängigkeit von der Veröffentlichungs-ID sortiert und die Abfrage funktioniert.

Publication.find({ 
    where: { 
    status: 'active' 
    } 
}) 
.populate('worksheetId').sort('id ASC').limit(10) 
.exec(function (error, publications) { 
}) 

So feuerte ich ähnliche Abfrage der Daten auf „orderWeight“

Publication.find({ 
    where: { 
     status: 'active' 
    } 
}) 
.populate('worksheetId').sort('worksheetId.orderWeight ASC').limit(10) 
.exec(function (error, publications) { 
}) 

Und diese Abfrage gibt mir Fehler zu sortieren, dass worksheetId.orderWeight nicht eine Spalte auf der Veröffentlichung Tabelle ist. Daher möchte ich diese Sortierabfrage auf die aufgefüllten Daten und nicht auf die Publikationstabelle anwenden.

Bitte lassen Sie mich wissen, wie ich mein erwartetes Ergebnis bekommen kann.

Neben der Methode sort() möchte ich auch einen Befehl find zu den aufgefüllten Daten ausführen, um die Publikation zu erhalten, in der der Name des Arbeitsblatts mit einem bestimmten Schlüssel übereinstimmt.

Antwort

0

Sie versuchen im Grunde, das Attribut einer Verknüpfung abzufragen. This has been in the waterline roadmap since 2014, but it's still not supported, so müssen Sie einen Workaround herausfinden.

Eine Option ist das Worksheet Modell abzufragen und bevölkern die Publication, da segelt man auf Modelle nicht lassen abfragen, ohne rohe Abfragen mit (d .sort('worksheetId.orderWeight ASC') nicht funktioniert). Leider müssen Sie möglicherweise das active-Flag auf die Worksheet verschieben. Zum Beispiel:

Worksheet.find({ 
    status: 'active' 
}) 
.populate('publication') // you should also add publication to Worksheet.js 
.sort('orderWeight ASC') 
.limit(10) 

Alternativ können Sie Worksheet und Publication in einem Modell kombinieren, da sie eine Eins-zu-eins sind. Wahrscheinlich nicht ideal, aber sails.js und Waterline machen es sehr schwierig, mit relationalen Daten zu arbeiten - ich würde schätzen, dass die Hälfte der Abfragen in dem Projekt, an dem ich arbeite, rohe Abfragen sind, da die Posts von Segel nicht gut unterstützt werden. Das Framework ist ziemlich voreingenommen gegenüber MongoDB, although it claims to "just work" with any of the "supported" DBs.