2016-07-29 3 views
0

Ich benutze Postgresql, Knex und Bookshelf, um Abfragen zu aktualisieren, um meine Benutzer-Tabelle zu aktualisieren. Ich möchte alle Benutzer finden, die sich zu einem bestimmten Zeitpunkt nicht angemeldet haben und dann ihr Feld numAbsences und numTardies aktualisieren.Zurückgeben und Aktualisieren einer Tabelle im Bookshelf Knex

Es scheint jedoch, dass wenn ich eine rohe SQL-Abfrage mit bookshelf.knnex das Ergebnis, das ich für Benutzer bekomme ein Array von Objekten und nicht ein Array von Bücherregal Objekte Objekte, weil ich die Objekte nicht direkt in die Datenbank, wenn ich versuche, .save() zu verwenden. Ich bekomme die Ausnahme .

Weiß jemand, wie ich die Werte in der Datenbank für die Benutzer aktualisieren kann? Ich habe die Aktualisierungsfunktion gesehen, aber ich muss auch die Benutzer in absentUsers zurückgeben, also wähle ich sie gerade aus.

// field indicates whether the student was late or absent 
var absentUsers = function(field){ 
    // returns all users who did not sign in during a specific time 
    if (ongoingClasses){ 
    return bookshelf.knex('users') 
     .join('signed_in', 'signed_in.studentId', '=', 'users.id') 
     .where('signed_in.signedIn', false) 
     .select() 
     .then(function(users){ 
     markAbsent(users, field); 
     return users; 
     }); 
    } 
} 

var markAbsent = function(users, field){ 
    users.forEach(function(user){ 
    user[field]++; 
    user.save(); 
    }) 
} 

Antwort

0

Ich habe mein Problem gelöst, indem Sie eine andere SQL-Abfrage in KNX verwenden. Es schien, dass es keine Möglichkeit gab, eine SQL-Abfrage zu verwenden und dann Standard-Bücherregal-Knex-Methoden zu verwenden, da die zurückgegebenen Objekte keine Bücherregal-Wrapper-Objekte waren.

var absentUsers = function(field){ 
    // returns all users who did not sign in during a specific time 
    if (ongoingClasses){ 
    return bookshelf.knex('users') 
     .join('signed_in', 'signed_in.studentId', '=', 'users.id') 
     .where('signed_in.signedIn', false) 
     .select() 
     .then(function(users){ 
     markAbsent(users, field); 
     }); 
    } 
} 

var markAbsent = function(users, field){ 
    users.forEach(function(user){ 
    var updatedUser = {}; 
    updatedUser[field] = user[field]+1; 
    bookshelf.knex('users') 
     .where('users.id', user.id) 
     .update(updatedUser).then(function(){ 
     }); 
    }); 
} 
0

mit Ihrem Code bookshelf.knex('users') verlassen Sie die "Bücherregal Welt" und sind in "raw Knex Welt". Knex weiß nichts über Ihre Bookshelf-Wrapper-Objekte.

Sie können Bookshelf query Methode verwenden, um das Beste aus beiden Welten zu erhalten.

Angenommen, Ihre Modellklasse ist User, würde Ihr Beispiel ungefähr so ​​aussehen

User.query(function(qb) { 
     qb.join('signed_in', 'signed_in.studentId', 'users.id') 
      .where('signed_in.signedIn', false); 
    }) 
    .fetchAll() 
    .then(function(bookshelfUserObjects) { 
     /*mark absent*/ 
     return bookshelfUserObjects.invokeThen('save'); // <1> 
    }); 

< 1>invokeThen: Rufmodells Methode für jede Instanz in der Sammlung

Verwandte Themen