Heim  >  Artikel  >  Web-Frontend  >  Der Unterschied zwischen Modell und Assoziation besteht darin, wann Sequelize Verbindungen herstellt und abfragt

Der Unterschied zwischen Modell und Assoziation besteht darin, wann Sequelize Verbindungen herstellt und abfragt

高洛峰
高洛峰Original
2017-02-28 14:32:561990Durchsuche

Vorwort

Jeder weiß, dass wir bei der Verwendung von Sequelize zur Durchführung von Verbindungsabfragen zwischen relationalen Modellen (Tabellen) model/as verwenden, um das Verbindungsabfragemodell anzugeben, dem bereits eine Beziehung zugeordnet ist, oder Durch Assoziation wird die Verbindungsabfragemodellbeziehung direkt angegeben. In welchen Szenarien sollten sie also jeweils verwendet werden?

1. Probenvorbereitung

Modelldefinition

Definieren Sie zunächst die beiden Modelle Benutzer und Unternehmen:

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

Wie oben gezeigt, haben wir zwei Modelle definiert, Benutzer und Unternehmen, und über „gehörtTo“ eine 1:1-Beziehung zwischen Benutzer und Unternehmen angegeben.

Daten einfügen

Als nächstes fügen Sie einige Testdaten basierend auf dem gerade definierten Beziehungsmodell ein:

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. Verwenden Sie model/as

beim Durchführen von Verbindungsabfragen, wenn die Zuordnung zwischen Modellen definiert wurde. Sie können das Modell angeben, das mit der Abfrage über das Attribut „model“ in der Option „Abfrage einschließen“ verbunden werden soll, und Sie können auch einen Alias ​​über das Attribut „as“ angeben.

Fragen Sie beispielsweise einen Benutzer aus dem Benutzermodell ab und fragen Sie die Unternehmensinformationen des Benutzers ab:

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

Die Abfrageergebnisse sind wie folgt:

何民三 是 某公司 的员工

3. Bei Verwendung der Assoziation

zum Verbinden von Abfragen, wenn die beiden zu verbindenden Modelle vorhanden sind nicht im Voraus definierte Verbindungsbeziehung, oder verwenden Sie eine Verbindungsbeziehung außerhalb der Definition. Zu diesem Zeitpunkt können Modellbeziehungen durch Assoziationen definiert oder neu definiert werden.

Fragen Sie beispielsweise ein beliebiges Unternehmen im Firmenmodell ab und fragen Sie den Administrator des Unternehmens ab:

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

Weil Firmen-Benutzer dort Da keine Modellbeziehung im Voraus definiert ist, müssen Sie die Assoziationsbeziehung angeben, die beim Verbinden der Abfrage in der Option „Include“ verwendet werden soll.

Die Abfrageergebnisse lauten wie folgt:

某公司 的管理员是 何民三

Assoziation wird nicht nur zur Angabe von Modellbeziehungen verwendet, die zuvor nicht definiert wurden. Es kann auch zur Wiederverwendung verwendet werden, um Modellbeziehungen zu definieren. Angenommen, wir definieren im Voraus eine 1:N-Beziehung zwischen Unternehmen und Benutzer über hasMany. Diese Beziehung gilt für alle Mitarbeiter des Abfrageunternehmens. Im obigen Beispiel müssen wir den Administrator des Unternehmens durch eine 1:1-Beziehung überprüfen. Daher können wir die Modellbeziehung durch Zuordnung neu definieren.

Weitere verwandte Artikel zum Unterschied zwischen Modell und Assoziation beim Einbinden während der Sequelize-Verbindungsabfrage finden Sie auf der chinesischen PHP-Website!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn