J'utilise sequelize ORM; tout est super et propre, mais j'ai eu un problème lorsque je l'utilise avec des join
requêtes. J'ai deux modèles: les utilisateurs et les messages.
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);
})
Je veux une requête qui répond avec un message avec les informations de l'utilisateur qui l'a créé. Dans la requête brute, j'obtiens ceci:
db.seq.query('SELECT * FROM posts, users WHERE posts.user_id = users.id ').success(function(rows){
res.json(rows);
});
Ma question est de savoir comment modifier le code pour utiliser le style ORM au lieu de la requête SQL?
la source
SELECT * FROM posts JOIN users ON users.id = posts.user_id WHERE users.year_birth = 1984
User.hasMany(Post)
vous ajoutez des méthodes / attributs à l'objet User, et lorsque vous appelez,Post.belongsTo(User)
vous ajoutez des méthodes à la classe Post. Si vous appelez toujours d'une direction (ex. User.getPosts ()), vous n'avez rien à ajouter à l'objet Post. Mais c'est bien d'avoir les méthodes des deux côtés.Bien que la réponse acceptée ne soit pas techniquement fausse, elle ne répond pas à la question initiale ni à la question de suivi dans les commentaires, ce que je recherchais ici. Mais je l'ai compris, alors voilà.
Si vous voulez trouver tous les articles qui ont des utilisateurs (et seulement ceux qui ont des utilisateurs) où le SQL ressemblerait à ceci:
Ce qui est sémantiquement la même chose que le SQL original de l'OP:
alors c'est ce que vous voulez:
La définition requise sur true est la clé pour produire une jointure interne. Si vous voulez une jointure externe gauche (où vous obtenez toutes les publications, qu'il y ait ou non un utilisateur lié), remplacez-la obligatoire par false ou laissez-la désactivée car c'est la valeur par défaut:
Si vous voulez trouver tous les messages appartenant aux utilisateurs dont l'année de naissance est 1984, vous voudrez:
Notez que obligatoire est true par défaut dès que vous ajoutez une clause where dans.
Si vous voulez tous les messages, qu'il y ait ou non un utilisateur attaché, mais s'il y a un utilisateur, seuls ceux nés en 1984, puis rajoutez le champ requis dans:
Si vous voulez tous les articles dont le nom est "Sunshine" et seulement s'ils appartiennent à un utilisateur né en 1984, vous feriez ceci:
Si vous voulez que toutes les publications dont le nom est "Sunshine" et uniquement si elles appartiennent à un utilisateur né la même année et qui correspondent à l'attribut post_year sur la publication, procédez comme suit:
Je sais, cela n'a pas de sens que quelqu'un publie un message l'année de sa naissance, mais ce n'est qu'un exemple - allez-y. :)
J'ai compris cela (principalement) à partir de ce document:
la source
posts.user_id = users.id
dans votre séquelle? mercila source
Dans mon cas, j'ai fait la chose suivante. Dans UserMaster userId est PK et dans UserAccess userId est FK de UserMaster
la source