簡體   English   中英

SequelizeJS HasOne關聯錯誤

[英]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( )以及setAssociationaddAssoc...

http://docs.sequelizejs.com/manual/tutorial/associations.html#belongs-to-many-associations

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM