[英]SequelizeJS HasOne association error
我對NodeJS和SequelizeJS相對較新,並且正在構建一個查詢時hasOne
問題,我想知道您對這個問題的想法,以找出我出了問題的地方以及實現此查詢的正確方法。
使用sequelize-auto(pg-hstore)生成的模型。
Bloco型號:
module.exports = function(sequelize, DataTypes) {
return sequelize.define('bloco_condominio', {
id_bloco: {
type: DataTypes.INTEGER,
allowNull: false,
autoIncrement: true,
primaryKey: true
},
id_condominio: {
type: DataTypes.INTEGER,
allowNull: false,
references: {
model: 'condominio',
key: 'id_condominio'
}
},
nm_bloco: {
type: DataTypes.STRING,
allowNull: true
},
ic_status: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: "A"
}
}, {
tableName: 'bloco_condominio'
});
};
公寓型號:
module.exports = function(sequelize, DataTypes) {
return sequelize.define('apartamento', {
id_apartamento: {
type: DataTypes.INTEGER,
allowNull: false,
autoIncrement: true,
primaryKey: true
},
id_condominio: {
type: DataTypes.INTEGER,
allowNull: false,
references: {
model: 'condominio',
key: 'id_condominio'
}
},
nu_apto: {
type: DataTypes.STRING,
allowNull: true
},
id_bloco: {
type: DataTypes.INTEGER,
allowNull: true,
references: {
model: 'bloco_condominio',
key: 'id_bloco'
}
},
ic_status: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: "A"
},
dt_incl: {
type: DataTypes.TIME,
allowNull: false,
defaultValue: sequelize.fn('now')
},
dt_ult_alt: {
type: DataTypes.TIME,
allowNull: false,
defaultValue: sequelize.fn('now')
}
}, {
tableName: 'apartamento'
});
};
公寓服務:
"use strict";
var model = require('../models');
var Utils = require('../utils/utils');
var service = {};
var Apartamento = model.apartamento;
var Bloco = model.bloco_condominio;
var Morador = model.morador;
var Pessoa = model.pessoa;
//Incluir relação OneToMany
Apartamento.hasMany(Morador, { as: "Moradores", foreignKey: 'id_apartamento' });
Morador.belongsTo(Apartamento, { foreignKey: 'id_apartamento' });
Morador.hasMany(Pessoa, { as: "Pessoa", foreignKey: 'id_pessoa' });
Pessoa.belongsTo(Morador, { foreignKey: 'id_pessoa' });
Bloco.hasMany(Apartamento, { as: "Bloco", foreignKey: 'id_bloco' });
Apartamento.hasMany(Bloco, { foreignKey: 'id_bloco' });
service.getApartamentoById = function(idApartamento) {
return Apartamento.findById(idApartamento, {
include: [
{ model: Morador, as: 'Moradores', include: [
{ model: Pessoa, as: 'Pessoa'}
]},
{ model: Bloco, as: 'Bloco' }
]
})
.then(function(data) {
return data;
})
.catch(function(err) {
throw 'Erro ao consultar apartamento por ID: ' + err.message + ' - Request: '+JSON.stringify(idApartamento);
});
};
我可以完美地檢索其他hasMany關聯,但是仍然沒有找到相反的方法。
你們對我應該如何正確解決此問題有任何想法嗎?
在此先感謝您的幫助!
最好的問候,恩里科·貝加莫
為了簡化我的工作(只懂英語),我從Google翻譯中抓取了以下內容:
Pessoa: Person
Morador: Dweller
Bloco: Block
Apartmento: Apartment
因此,居民可以有很多人,一個公寓可以有很多居民,而一個街區可以有很多公寓。
您在其他模型上的定義表明它們都是1:m,因此我對公寓和街區遵循了這一假設。
考慮到這一點,以下應該起作用。
Bloco.hasMany(Apartamento, { as: "Apartmento", foreignKey: 'id_bloco' });
Apartamento.belongsTo(Bloco, { foreignKey: 'id_bloco' });
注意:我已經將
as: "Bloco"
更改as: "Apartmento"
,第二個hasMany
屬於belongsTo
。 這可能是您的問題所在。
編輯:訪問屬於一個塊的公寓的方法是:
bloco.getApartmento(options)
我有這個承諾鏈一起工作:
Bloco.create()
.then(block => {
return Promise.all([
block,
Apartamento.bulkCreate([{
id_bloco: block.id_bloco
}, {
id_bloco: block.id_bloco
}, {
id_bloco: block.id_bloco
}, {
id_bloco: block.id_bloco
}, {}])
])
})
.spread((bloco, apartment) => {
return bloco.getApartamento()
})
.then(apartments => {
console.log(apartments.length); --> Logs 4 which matches the bulk create.
})
如果我誤解了,它應該是n:m的關系(公寓/街區),那么您應該在每個模型上使用belongsToMany並確定through
選項。
Bloco.belongsToMany(Apartamento, {
as: "Apartmentos",
foreignKey: 'id_bloco',
through: "BlocoAparmento"
});
Apartamento.belongsToMany(Bloco, {
as: "Blocos",
foreignKey: 'id_apartmento',
through: "BlocoAparmento"
});
這將創建一個稱為“ BlockApartmento”的n:m連接表。 如果定義該模型,並使用模型而不是字符串,則可以完全控制模型設置。
這將為您提供Bloco.getApartmentos(
方法以及相反的方法( Apartmento.getBlocos(
)以及setAssociation
, addAssoc...
等
http://docs.sequelizejs.com/manual/tutorial/associations.html#belongs-to-many-associations
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.