Maison > interface Web > js tutoriel > La différence entre le modèle et l'association est incluse lorsque Sequelize se connecte et interroge

La différence entre le modèle et l'association est incluse lorsque Sequelize se connecte et interroge

高洛峰
Libérer: 2017-02-28 14:32:56
original
2045 Les gens l'ont consulté

Avant-propos

Tout le monde sait que lors de l'utilisation de Sequelize pour effectuer des requêtes de connexion entre des modèles relationnels (tables), nous utiliserons model/as pour spécifier le modèle de requête de connexion qui a déjà une relation associée, ou via association pour spécifier directement la relation du modèle de requête de connexion. Alors, dans quels scénarios chacun doit-il être utilisé ?

1. Préparation des échantillons

Définition du modèle

Tout d'abord, définissez les deux modèles d'utilisateur et d'entreprise :

'use strict'

const Sequelize = require('sequelize');

// 创建 sequelize 实例
const sequelize = new Sequelize('db1', 'root', '111111', {logging: console.log});

// 定义User模型
var User = sequelize.define('user', {
 id:{type: Sequelize.BIGINT(11), autoIncrement:true, primaryKey : true, unique : true},
 name: { type: Sequelize.STRING, comment:'姓名' },
 sex: { type: Sequelize.INTEGER, allowNull: false, defaultValue: 0, comment:'性别' },
 companyId: { type: Sequelize.BIGINT(11), field: 'company_id', allowNull: false, comment:'所属公司' },
 isManager: { type: Sequelize.BOOLEAN, field: 'is_manager', allowNull: false, defaultValue: false, comment:'是否管理员'}
}, 
{ charset: 'utf8',
 collate: 'utf8_general_ci'});

// 定义Company模型
var Company = sequelize.define('company', {
 id:{ type:Sequelize.BIGINT(11), autoIncrement:true, primaryKey : true, unique : true},
 name: { type: Sequelize.STRING, comment:'公司名称' }
}, 
{ charset: 'utf8',
 collate: 'utf8_general_ci'});

// 定义User-Company关联关系
User.belongsTo(Company, {foreignKey:'companyId'});

// sequelize.sync({force:true}).then(() => {
// process.exit();
// });
Copier après la connexion

Comme indiqué ci-dessus, nous avons défini deux modèles, Utilisateur et Entreprise, et spécifié une relation 1:1 entre l'Utilisateur et l'Entreprise via AppartientTo.

Insérer des données

Ensuite, insérez quelques données de test basées sur le modèle de relation qui vient d'être défini :

Company.create({name:'某公司'}).then((result) => {
 return Promise.all([
 User.create({name:'何民三', sex:1, companyId:result.id, isManager: true}),
 User.create({name:'张老二', sex:1, companyId:result.id})
 ])
}).then((result) => {
 console.log('done');
}).catch((err) => {
 console.error(err);
});
Copier après la connexion

2. Utilisez model/as

lors de l'exécution de requêtes de connexion, si l'association entre les modèles a été définie. Vous pouvez spécifier le modèle à connecter à la requête via l'attribut « model » dans l'option d'inclusion de requête, et vous pouvez également spécifier un alias via l'attribut « as ».

Par exemple, interrogez un utilisateur à partir du modèle Utilisateur et interrogez les informations sur l'entreprise de l'utilisateur :

var include = [{
 model: Company,
 as: 'company'
}];
User.findOne({include:include}).then((result) => {
 console.log(result.name + ' 是 '+result.company.name+' 的员工');
}).catch((err) => {
 console.error(err);
});
Copier après la connexion

Les résultats de la requête sont comme suit :

何民三 是 某公司 的员工
Copier après la connexion

3. Lors de l'utilisation de l'association

pour connecter des requêtes, si les deux modèles à connecter sont non défini à l'avance Relation de connexion, ou utiliser une relation de connexion en dehors de la définition. À ce stade, les relations modèles peuvent être définies ou redéfinies par association.

Par exemple, interrogez n'importe quelle entreprise dans le modèle Entreprise et interrogez l'administrateur de l'entreprise :

var include = [{
 association: Company.hasOne(User, {foreignKey:'companyId', as:'manager'}),
 where: {isManager:true}
}]

Company.findOne({include:include}).then((result) => {
 console.log(result.name +' 的管理员是 ' +result.manager.name);
}).catch((err) => {
 console.error(err);
});
Copier après la connexion

Parce que l'utilisateur de l'entreprise est là Aucune relation de modèle n'est définie à l'avance, vous devez donc spécifier la relation d'association à utiliser lors de la connexion de la requête dans l'option include.

Les résultats de la requête sont les suivants :

某公司 的管理员是 何民三
Copier après la connexion

L'association n'est pas seulement utilisée pour spécifier des relations de modèle qui n'ont pas été définies auparavant, il peut également être utilisé pour réutiliser Définir les relations du modèle. Par exemple, supposons que nous définissions à l’avance une relation 1:N entre Société-Utilisateur via hasMany. Cette relation s'applique à tous les employés de la société interrogée. Dans l'exemple ci-dessus, nous devons vérifier l'administrateur de l'entreprise via une relation 1:1. Nous pouvons donc redéfinir la relation modèle par association.

Pour plus d'articles sur la différence entre le modèle et l'association dans l'inclusion lors de la requête de connexion Sequelize, veuillez faire attention au site Web PHP chinois !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal