Ich benutze Sequelize ORM; Alles ist großartig und sauber, aber ich hatte ein Problem, wenn ich es mit join
Abfragen verwende. Ich habe zwei Modelle: Benutzer und Beiträge.
var User = db.seq.define('User',{
username: { type: db.Sequelize.STRING},
email: { type: db.Sequelize.STRING},
password: { type: db.Sequelize.STRING},
sex : { type: db.Sequelize.INTEGER},
day_birth: { type: db.Sequelize.INTEGER},
month_birth: { type: db.Sequelize.INTEGER},
year_birth: { type: db.Sequelize.INTEGER}
});
User.sync().success(function(){
console.log("table created")
}).error(function(error){
console.log(err);
})
var Post = db.seq.define("Post",{
body: { type: db.Sequelize.TEXT },
user_id: { type: db.Sequelize.INTEGER},
likes: { type: db.Sequelize.INTEGER, defaultValue: 0 },
});
Post.sync().success(function(){
console.log("table created")
}).error(function(error){
console.log(err);
})
Ich möchte eine Abfrage, die mit einem Beitrag mit den Informationen des Benutzers antwortet, der sie erstellt hat. In der Rohabfrage erhalte ich Folgendes:
db.seq.query('SELECT * FROM posts, users WHERE posts.user_id = users.id ').success(function(rows){
res.json(rows);
});
Meine Frage ist, wie ich den Code ändern kann, um den ORM-Stil anstelle der SQL-Abfrage zu verwenden.
quelle
SELECT * FROM posts JOIN users ON users.id = posts.user_id WHERE users.year_birth = 1984
User.hasMany(Post)
, fügen Sie dem Benutzerobjekt Methoden / Attribute hinzu, und wenn Sie aufrufenPost.belongsTo(User)
, fügen Sie der Post-Klasse Methoden hinzu. Wenn Sie immer aus einer Richtung anrufen (z. B. User.getPosts ()), müssen Sie dem Post-Objekt nichts hinzufügen. Aber es ist schön, die Methoden auf beiden Seiten zu haben.Die akzeptierte Antwort ist zwar technisch nicht falsch, beantwortet aber weder die ursprüngliche Frage noch die Folgefrage in den Kommentaren, nach denen ich hier gesucht habe. Aber ich habe es herausgefunden, also geht es los.
Wenn Sie alle Posts mit Benutzern finden möchten (und nur diejenigen mit Benutzern), in denen SQL folgendermaßen aussehen würde:
Das ist semantisch dasselbe wie das ursprüngliche SQL des OP:
dann ist es was du willst:
Die Einstellung true ist der Schlüssel zum Erstellen einer inneren Verknüpfung. Wenn Sie einen linken äußeren Join möchten (bei dem Sie alle Posts erhalten, unabhängig davon, ob ein Benutzer verlinkt ist), ändern Sie die erforderliche Änderung in "false" oder lassen Sie sie aus, da dies die Standardeinstellung ist:
Wenn Sie alle Beiträge von Benutzern finden möchten, deren Geburtsjahr 1984 liegt, möchten Sie:
Beachten Sie, dass erforderlich standardmäßig true ist, sobald Sie eine where-Klausel hinzufügen.
Wenn Sie alle Beiträge möchten, unabhängig davon, ob ein Benutzer angehängt ist, aber wenn ein Benutzer vorhanden ist, nur die 1984 geborenen, fügen Sie das erforderliche Feld wieder hinzu in:
Wenn Sie alle Posts möchten, bei denen der Name "Sunshine" lautet und die nur einem Benutzer gehören, der 1984 geboren wurde, gehen Sie folgendermaßen vor:
Wenn Sie alle Posts mit dem Namen "Sunshine" möchten und nur dann, wenn er einem Benutzer gehört, der im selben Jahr geboren wurde und dem Attribut "post_year" des Posts entspricht, gehen Sie folgendermaßen vor:
Ich weiß, es macht keinen Sinn, dass jemand in dem Jahr, in dem er geboren wurde, einen Beitrag verfasst, aber es ist nur ein Beispiel - machen Sie mit. :) :)
Ich habe dies (meistens) aus diesem Dokument herausgefunden:
quelle
posts.user_id = users.id
Also , was repräsentiert in deiner Fortsetzung? dankequelle
In meinem Fall habe ich folgendes getan. In UserMaster ist userId PK und in UserAccess ist userId FK von UserMaster
quelle