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

高洛峰
高洛峰original
2017-02-28 14:32:561999parcourir

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();
// });

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);
});

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);
});

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

何民三 是 某公司 的员工

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);
});

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 :

某公司 的管理员是 何民三

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 !


Déclaration:
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