Appearance
Relation entre deux modèles
Pour créer une relation entre deux modèles dans Sequelize, vous devez d'abord définir les modèles, puis spécifier la nature de leur relation (par exemple, hasOne
, belongsTo
, hasMany
, belongsToMany
).
Supposons que vous ayez un modèle Article
et que vous souhaitiez créer une relation où chaque User
peut avoir plusieurs Article
. Voici comment vous pouvez le faire :
Définition du Modèle Article
Créons d'abord un modèle simple pour Article
:
javascript
const Article = sequelize.define('article', {
title: {
type: Sequelize.STRING,
allowNull: false
},
content: {
type: Sequelize.TEXT,
allowNull: false
}
// Vous pouvez ajouter d'autres champs ici
}, {
// options
});
const Article = sequelize.define('article', {
title: {
type: Sequelize.STRING,
allowNull: false
},
content: {
type: Sequelize.TEXT,
allowNull: false
}
// Vous pouvez ajouter d'autres champs ici
}, {
// options
});
Création de la Relation entre User
et Article
Ensuite, nous définissons la relation entre User
et Article
. Dans cet exemple, nous supposons que vous avez déjà défini le modèle User
comme décrit précédemment (voir les chapitres précédents)
javascript
// User a plusieurs Article
User.hasMany(Article, {
foreignKey: 'userId',
as: 'articles'
});
// Article appartient à User
Article.belongsTo(User, {
foreignKey: 'userId',
as: 'user'
});
// User a plusieurs Article
User.hasMany(Article, {
foreignKey: 'userId',
as: 'articles'
});
// Article appartient à User
Article.belongsTo(User, {
foreignKey: 'userId',
as: 'user'
});
Explication
User.hasMany(Article, {...})
: Cela crée une relation one-to-many deUser
àArticle
. Chaque utilisateur peut avoir plusieurs articles.foreignKey: 'userId'
ajoute une clé étrangèreuserId
au modèleArticle
, reliant chaque article à un utilisateur spécifique.as: 'articles'
est utilisé pour donner un nom personnalisé à cette relation.Article.belongsTo(User, {...})
: Cela indique que chaqueArticle
appartient à unUser
. La clé étrangèreuserId
dansArticle
pointe versUser
.
Utilisation de la Relation
Après avoir défini ces relations, vous pouvez effectuer des requêtes pour récupérer les données en tenant compte de la relation. Par exemple, pour récupérer tous les articles d'un utilisateur spécifique avec Sequelize, vous pouvez faire :
javascript
User.findOne({
where: { id: userId },
include: [{
model: Article,
as: 'articles'
}]
}).then(userWithArticles => {
console.log(userWithArticles);
});
User.findOne({
where: { id: userId },
include: [{
model: Article,
as: 'articles'
}]
}).then(userWithArticles => {
console.log(userWithArticles);
});
Dans cet exemple, User.findOne
inclut tous les Article
associés à cet utilisateur spécifique. La relation est utilisée pour joindre les tables et récupérer les données associées.
hasOne
et belongsToMany
Les méthodes hasOne
et belongsToMany
dans Sequelize sont utilisées pour définir des types spécifiques de relations entre les modèles dans une base de données relationnelle. Ces relations sont essentielles pour modéliser comment les données dans une table sont liées à celles dans une autre.
hasOne
La relation hasOne
est utilisée pour indiquer une relation un-à-un entre deux modèles. Cela signifie que chaque instance du modèle source peut être associée à une, et une seule, instance du modèle cible.
Exemple :
Supposons que vous ayez un modèle User
et un modèle UserProfile
, où chaque utilisateur a un seul profil utilisateur. Vous pouvez définir cette relation comme suit :
javascript
User.hasOne(UserProfile, {
foreignKey: 'userId',
as: 'profile'
});
User.hasOne(UserProfile, {
foreignKey: 'userId',
as: 'profile'
});
Ici, User.hasOne(UserProfile)
signifie qu'une instance de User
peut avoir un seul UserProfile
associé. La foreignKey
'userId' dans UserProfile
indique la colonne qui relie le UserProfile
à son User
. L'alias as: 'profile'
est utilisé pour accéder à cette relation dans les requêtes.
belongsToMany
La relation belongsToMany
est utilisée pour représenter une relation plusieurs-à-plusieurs entre deux modèles. Dans cette relation, une instance du modèle source peut être associée à plusieurs instances du modèle cible et vice versa.
Exemple :
Prenons un exemple avec des modèles Student
et Course
, où un étudiant peut s'inscrire à plusieurs cours et un cours peut avoir plusieurs étudiants inscrits.
javascript
Student.belongsToMany(Course, {
through: 'StudentCourses',
foreignKey: 'studentId',
otherKey: 'courseId'
});
Course.belongsToMany(Student, {
through: 'StudentCourses',
foreignKey: 'courseId',
otherKey: 'studentId'
});
Student.belongsToMany(Course, {
through: 'StudentCourses',
foreignKey: 'studentId',
otherKey: 'courseId'
});
Course.belongsToMany(Student, {
through: 'StudentCourses',
foreignKey: 'courseId',
otherKey: 'studentId'
});
Ici, Student.belongsToMany(Course)
et Course.belongsToMany(Student)
définissent une relation plusieurs-à-plusieurs. La table StudentCourses
est une table de jointure (ou table d'association) qui contient les clés étrangères référençant à la fois Student
et Course
. Les propriétés foreignKey
et otherKey
définissent les noms des colonnes de clé étrangère dans la table de jointure.