ホームページ > ウェブフロントエンド > jsチュートリアル > モデルとアソシエーションの違いには、Sequelize が接続してクエリを実行する場合が含まれます

モデルとアソシエーションの違いには、Sequelize が接続してクエリを実行する場合が含まれます

高洛峰
リリース: 2017-02-28 14:32:56
オリジナル
2023 人が閲覧しました

前書き

Sequelize を使用してリレーショナル モデル (テーブル) 間の接続クエリを実行する場合、model/as を使用してすでに関連付けられた関係を持つ接続クエリ モデルを指定するか、関連付けを使用して接続クエリを直接指定することは誰もが知っています。モデル関係。では、それぞれどのようなシナリオで使用する必要があるのでしょうか?

1. サンプルの準備

モデル定義

まず、User と Company の 2 つのモデルを定義します。は 1: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();
// });
ログイン後にコピー

次に、モデル間の関連付けが定義されている場合は、接続クエリを実行するときに、model/as

を使用します。 。 include query オプションの 'model' 属性を使用して、クエリに接続するモデルを指定できます。また、'as' 属性を使用してエイリアスを指定することもできます。

たとえば、User モデルからユーザーをクエリし、そのユーザーの会社情報をクエリします。


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);
});
ログイン後にコピー

クエリの結果は次のようになります:

var include = [{
 model: Company,
 as: 'company'
}];
User.findOne({include:include}).then((result) => {
 console.log(result.name + ' 是 '+result.company.name+' 的员工');
}).catch((err) => {
 console.error(err);
});
ログイン後にコピー

クエリ対象の 2 つのモデル間に事前に定義された接続関係がない場合、または定義外の接続関係が使用される場合、クエリを接続します。現時点では、関連付けを通じてモデルの関係を定義または再定義できます。

たとえば、Company モデル内の任意の会社をクエリし、その会社の管理者をクエリします:

何民三 是 某公司 的员工
ログイン後にコピー


会社とユーザーの間には事前定義されたモデル関係がないため、接続クエリをinclude オプション 使用する関連付け。

クエリ結果は次のとおりです:

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);
});
ログイン後にコピー

アソシエーションは、以前に定義されていないモデルの関係を指定するために使用されるだけでなく、モデルの関係を再定義するためにも使用できます。たとえば、事前に hasMany を通じて Company-User の 1:N 関係を定義したとします。この関係は、クエリ会社のすべての従業員に適用されます。上記の例では、1 対 1 の関係を通じて会社の管理者を確認する必要があるため、関連付けを通じてモデルの関係を再定義できます。

Sequelize 接続クエリ中のインクルードにおけるモデルとアソシエーションの違いに関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート