1
resposta

[DUVIDA] Associações entre tabelas

Estou criando 2 tabelas que se interagem. O sentido delas é uma receber todas as transações realizadas, seja entrada ou saída, e outra que vai consolidar essas informações de acordo com o nome do produto. Algo semelhante a um estoque.

Criei uma tabela terceira(TransacoesConsolidacoes), onde os ID's de cada tabela estarão relacionados para realizar alterações ou exclusão de acordo com o desejo do usuário.

A minha dúvida é: o ASSOCIATE é uma função para fazer um JOIN entre as duas tabelas (Transacoes e Consolidacoes) e criar a terceira (TransacoesConsolidacoes) ? Ele deveria popular automaticamente no SQL, já que tenho que criar um migrate para a tarceira tabela? Porém quando vou ao BD e faço um SELECT a tabela TransacoesConsolidacoes está em branco, acho que deveria ser populado automaticamente, já que quando criado o migrate, é dito quais são as references.

Segue o modelo da tabela Transações:

module.exports = (sequelize, DataTypes) => {
  const Transacoes = sequelize.define('Transacoes', {
    tipo: DataTypes.STRING,
    ticker: DataTypes.STRING,
    qtd: DataTypes.INTEGER,
    preco: DataTypes.FLOAT,
    taxa: {type: DataTypes.FLOAT, allowNull: true, defaultValue: 0.0},
    total: DataTypes.FLOAT,
    data: DataTypes.DATEONLY
  },
  {
    sequelize,
    modelName: 'transacoes',

  });
  return Transacoes

};
Transacoes.associate = (models) =>{
Transacoes.belongsToMany(
  Model.models.Consolidacoes,{
  through: 'TransacoesConsolidacoes',
  foreignKey: 'transacoes_id', 
  as: 'consolidacoes'

});
}

Segue o model da tabela Consolidações:

module.exports = (sequelize, DataTypes) => {
const Consolidacoes = sequelize.define('Consolidacoes', {
  precoMedio: DataTypes.FLOAT,
  qtdTotal: DataTypes.FLOAT,
  valorTotal: DataTypes.FLOAT
}, {
  sequelize,
  modelName: 'Consolidacoes',
});

return Consolidacoes
};

Consolidacoes.associate = (models) =>{
  Consolidacoes.belongsToMany(
    Model.models.Transacoes, {
    through: 'TransacoesConsolidacoes',
    foreignKey: 'consolidacoes_id', 
    as: 'transacoes'
  });
}

Segue o model da tabela TransacoesConsolidações:

module.exports = (sequelize, DataTypes) => {
    const TransacoesConsolidacoes = sequelize.define('TransacoesConsolidacoes', {
    },
    {
      sequelize,
      modelName: 'transacoesconsolidacoes',
    });
    return TransacoesConsolidacoes
    };

    TransacoesConsolidacoes.associate = (models) => {
  TransacoesConsolidacoes.belongsToMany(Model.models.Transacoes, 
   {through: 'TransacoesConsolidacoes',
     foreignKey: 'transacoes_id', 
     as: 'consolidacoes'});

  TransacoesConsolidacoes.belongsToMany(Model.models.Consolidacoes, 
  {through: 'TransacoesConsolidacoes',
    foreignKey: 'consolidacoes_id', 
    as: 'transacoes'});
}
1 resposta

Olá Lucas, tudo bem? Espero que sim.

Peço desculpa pela demora em responder o seu tópico.

O método "associate", normalmente, é utilizado para definir as associações entre as tabelas e não para fazer um JOIN entre elas. É responsável também, por criar as referências entre as tabelas e definir como elas se relacionam.

Ao criar o migrate para a terceira tabela, você está apenas criando a estrutura da tabela e definindo as referências que ela terá com as outras duas tabelas. Para popular a tabela, você precisa inserir manualmente os dados ou criar um script para fazer isso.

Sobre o código que você postou, percebi que há um erro na definição das associações. Você está utilizando "belongsToMany" em vez de "belongsTo". O método "belongsTo" é utilizado quando uma tabela tem uma chave estrangeira que referencia a chave primária de outra tabela. Já o método "belongsToMany" é utilizado quando há uma associação muitos para muitos entre duas tabelas.

Então, como solução, sugiro que você corrija a definição das associações e tente inserir manualmente alguns dados na tabela TransacoesConsolidacoes para verificar se está funcionando corretamente.

Espero ter ajudado. Caso tenha mais alguma pergunta, relacionada com o tópico, estarei a disposição para ajudá-lo.

Grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software