Code Hard
Code Hard

Reputation: 21

one-to-many relationship with sequelize

I have 2 tables, users and users_signature where the signature takes several applications and I need to make a select according to the application.

Models:

user

const { INTEGER } = require('sequelize');
const Sequelize = require('sequelize');
const database = require('../../config/db');
const User_has_signature = require('./user_has_signature');
 
const Usuario = database.define('usuario', {
    usu_id: {
        type: Sequelize.INTEGER,
        autoIncrement: true,
        allowNull: false,
        primaryKey: true
    },
    usu_rg: {
        type: Sequelize.STRING,
    },
},
{
    freezeTableName: true,
    createdAt: false,
    updatedAt: false,
});
User.hasMany(User_has_signature, {as: 'user_has_signature'});

module.exports = User;

User_has_signature

const { INTEGER } = require('sequelize');
const Sequelize = require('sequelize');
const database = require('../../config/db');
 
const User_has_signature = database.define('user_has_signature', {
    usu_has_signature_id: {
        type: Sequelize.INTEGER,
        autoIncrement: true,
        allowNull: false,
        primaryKey: true
    },
    user_usu_id: {
        type: Sequelize.STRING,
    },
    signature_aplicativo_signature_aplicativo_id: {
        type: Sequelize.STRING,
    },
    signature_type_signature_type_id: {
        type: Sequelize.STRING,
    },
},
{
    freezeTableName: true,
    createdAt: false,
    updatedAt: false,
});
User_has_signature.associate = (models) => {
    User_has_signature.belongsTo(models.User,
      { foreignKey: 'user_usu_id', as: 'users' });
  };
module.exports = User_has_signature;

Controller

UserController

const User = require("../../model/user/user")
const User_has_signature = require("../../model/user/user_has_signature")

async index(req, res){
        const user = await User.findAll({
            include: [{
              model: User_has_signature,
              foreignKey: 'user_usu_id',
              through: {
                where: {signature_ttype_signature_type_id: 3}
              }
            }]
          })
        res.status(200).json(user)
        return
    }

The error that is returning to me in the terminal is: (node:15168) UnhandledPromiseRejectionWarning: SequelizeEagerLoadingError: user_has_signature is associated to usuario using an alias. You must use the 'as' keyword to specify the alias within your include statement

Upvotes: 0

Views: 698

Answers (1)

TeaLambig
TeaLambig

Reputation: 26

I think you have to specify the alias you have given when writing your query :

include: [{
          model: User_has_signature,
          foreignKey: 'user_usu_id',
          as : 'users'
          through: {
            where: {signature_ttype_signature_type_id: 3}
}]

Either way I'm using Sequelize more in Typescript, so I'm not sure of the syntax.

The way it handles One to Many relationship isn't the clearest I've seen (Like Symfony or Spring)

Upvotes: 1

Related Questions