>  기사  >  웹 프론트엔드  >  Sequelize가 연결하고 쿼리할 때 포함되는 모델과 연관의 차이점

Sequelize가 연결하고 쿼리할 때 포함되는 모델과 연관의 차이점

高洛峰
高洛峰원래의
2017-02-28 14:32:561990검색

머리말

Sequelize를 사용하여 관계형 모델(테이블) 간의 연결 쿼리를 수행할 때 이미 연관된 관계가 있는 연결 쿼리 모델을 지정하기 위해 model/as를 사용한다는 것은 누구나 알고 있습니다. 연결을 통해 연결 쿼리 모델 관계를 직접 지정합니다. 그렇다면 각각은 어떤 시나리오에서 사용해야 할까요?

1. 샘플 준비

모델 정의

먼저 사용자와 회사의 두 가지 모델을 정의합니다.

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

위와 같이 User와 Company라는 2개의 모델을 정의하고, BeingTo를 통해 User와 Company의 1:1 관계를 명시하였습니다.

데이터 삽입

다음으로 방금 정의한 관계 모델을 기반으로 일부 테스트 데이터를 삽입합니다.

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. 연결 쿼리를 수행할 때 모델 간 연결이 정의된 경우 모델 /as

를 사용하세요. include 쿼리 옵션의 'model' 속성을 통해 쿼리에 연결할 모델을 지정할 수 있으며, 'as' 속성을 통해 별칭을 지정할 수도 있습니다.

예를 들어 User 모델에서 사용자를 쿼리하고 해당 사용자의 회사 정보를 쿼리합니다.

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

쿼리 결과는 다음과 같습니다. :

何民三 是 某公司 的员工

3. Association

을 사용하여 쿼리를 연결할 때, 사전에 정의된 연결 관계가 없는 경우 두 모델을 연결하거나 정의 외부에서 연결 관계를 사용합니다. 이때 모델 관계는 연관을 통해 정의되거나 재정의될 수 있습니다.

예를 들어 Company 모델의 모든 회사를 쿼리하고 해당 회사의 관리자에게 쿼리합니다.

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

회사 간의 관계로 인해- User 모델 관계는 미리 정의되어 있지 않으므로, include 옵션에서 쿼리 연결 시 사용할 연관 관계를 지정해 주어야 합니다.

쿼리 결과는 다음과 같습니다:

某公司 的管理员是 何民三

association, 이전에 정의되지 않은 모델 관계를 지정하는 데 사용되는 것 외에도, 모델 관계를 재정의하는 데에도 사용할 수 있습니다. 예를 들어, hasMany를 통해 Company-User 간의 1:N 관계를 미리 정의해 놓았다고 가정해 보겠습니다. 이 관계는 쿼리 회사 아래의 모든 직원에게 적용됩니다. 위의 예에서는 1:1 관계를 통해 회사의 관리자를 확인해야 하므로 연관을 통해 모델 관계를 재정의할 수 있습니다.

Sequelize 연결 쿼리 중 포함에서 모델과 연관의 차이점에 대한 더 많은 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.