머리말
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 중국어 웹사이트를 주목하세요!