Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

"Unknown column 'PessoaId' in 'field list'"

Eu já sei o que ocorre, só não achei como resolver. Acontece que meu model de turma não está gerando os campos corretamente. Na verdade ele até gera minha chaves estrangeiras com nome personalizado(docente_id), porém ele gera a automática também (PessoaId) causando o erro "Unknown column 'PessoaId' in 'field list'". Conseguir "resolver" entre muitas aspas, refazendo as migrações, alterando os campos de foreign key para o nome que é gerado automaticamente pelo sequelize, mas esse não é o correto e gostaria de saber como posso resolver.

model turmas:

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class Turmas extends Model {
    static associate(models) {
      Turmas.hasMany(models.Matriculas, {
        foreignKey: 'turma_id'
      });
      Turmas.belongsTo(models.Pessoas);
      Turmas.belongsTo(models.Niveis);
    }
  }
  Turmas.init({
    data_inicio: DataTypes.DATEONLY
  }, {
    sequelize,
    modelName: 'Turmas',
  });
  return Turmas;
};

model pessoas (FK de turma)

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class Pessoas extends Model {
    static associate(models) {
      Pessoas.hasMany(models.Matriculas, {
        foreignKey: 'estudante_id'
      });
      Pessoas.hasMany(models.Turmas, {
        foreignKey: 'docente_id'
      });
    }
  }
  Pessoas.init({
    nome: DataTypes.STRING,
    ativo: DataTypes.BOOLEAN,
    email: DataTypes.STRING,
    role: DataTypes.STRING
  }, {
    sequelize,
    modelName: 'Pessoas',
  });
  return Pessoas;
};

model niveis (FK turmas)

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class Niveis extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      Niveis.hasMany(models.Turmas, {
        foreignKey: 'nivel_id'
      });
    }
  }
  Niveis.init({
    desc_nivel: DataTypes.STRING
  }, {
    sequelize,
    modelName: 'Niveis',
  });
  return Niveis;
};

migrate create-turmas:

'use strict';
module.exports = {
  async up(queryInterface, Sequelize) {
    await queryInterface.createTable('Turmas', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      data_inicio: {
        type: Sequelize.DATEONLY
      },
      docente_id: {
        allowNull: false,
        type: Sequelize.INTEGER,
        references: { model: 'Pessoas', key: 'id' }
      },
      nivel_id: {
        allowNull: false,
        type: Sequelize.INTEGER,
        references: { model: 'Niveis', key: 'id' }
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  async down(queryInterface, Sequelize) {
    await queryInterface.dropTable('Turmas');
  }
};

Controller e route tenho 100% de certeza que está correto mas se quiser ver estarei anexando meu repositório do GitHub. Eu configurei um debuger e consegui essa print que mostra os campos duplicados em um objeto, veja:

Debug mostrando objeto com campos do model

Bom, isso é tudo espero que consigam me ajudar!

PS: O código pode estar diferente da aula pois a versão é mais atual. Link do meu repositório caso queira ver melhor: https://github.com/Alyson02/ORM-com-Node

2 respostas
solução!

No model turmas adiciona o foreignKey para Pessoas e Niveis:

static associate(models) {
      Turmas.hasMany(models.Matriculas, {
        foreignKey: 'turma_id'
      })
      Turmas.belongsTo(models.Pessoas, {
        foreignKey: 'docente_id'
      })
      Turmas.belongsTo(models.Niveis, {
        foreignKey: 'nivel_id'
      })
}

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Solução mais simples do que a raiva que passei pra perceber. Na versão 6 do sequelize, se não passar options para o belongsTo acontece isso mesmo. Enquanto o da professora não precisava, is this...