Skip to content

Issues with associations when adding a new model #1

Description

Hi, first at all, Thanks for the great example that you have created. I have learnt a lot from it. I just wondering how would you deal with the following scenario?

In you thoughts model you add a new field call userId and then create a new model for users, the idea behind this is to get all the thoughts and also link the user that created the thought as an object.

thoughts {
id
userId
name
thought
user(id:userId) {
id
firstname
lastname
}
}

I have created the user model and the associations but I have been struggling a bit to make it work.

---- User Model ----

`//Models
const models = require('./../models');
const MODEL_NAME = 'User';

exports.default = function( sequelize, DataTypes ) {

if ( !sequelize || !DataTypes ) {
    throw new Error( MODEL_NAME + ' Model must be imported using sequelize.import(\'path/to/' + MODEL_NAME + '.js\'');
}

const definition = {
    id : {
        type 			: DataTypes.INTEGER,
        autoIncrement 	: true,
        primaryKey      : true,
        autoIncrement   : true,
        unique          : true
    },
    firstname 	: DataTypes.STRING,
    lastname 	: DataTypes.STRING,
    password    : {
    	type :  DataTypes.STRING,
    	validate: {
			notEmpty: true
		}
    },
    email       : {
        type 		: DataTypes.STRING,
        allowNull	: false,
        unique : {
            args    : true,
            msg     : 'Oops. Looks like you already have an account with this email address. Please try to login.',
            fields  : [ sequelize.fn('lower', sequelize.col('email')) ]
        },            
    },        
    createdBy    		 : DataTypes.INTEGER,
    createdDate  		 : DataTypes.INTEGER
};

const User = sequelize.define( MODEL_NAME, definition, {
    tableName : 'users',
    freezeTableName: true
});

// Class Method
User.associate = function ( m ) {
    // associations can be defined here
    m.User.hasMany( m.Thought, { as : 'thoughts', foreignKey : 'id' });
};

 /**
 * @name: getUserByEmail
 *
 * @description: Get user by email
 * @param: {email}
 * @return {object}
 * @api public
 */
User.getUserByEmail = function ( email ) {
    return this.find({
        where: { email : email }
    });
};

/**
 * @name: getAll
 *
 * @description: Get all users
 * @param: {}
 * @return {object}
 * @api public
 */
User.getAll = function () {

    return this.findAll({
        include: [
            { model : models.default.Thought, as : 'thoughts', required : true },
        ]
    });
};

return User;

};
`

--- Thought Model ----

`const models = require ( './../models' );
const MODEL_NAME = 'Thought';

// Thought Model
exports.default = function ( sequelize, dataTypes ) {

if ( !sequelize || !dataTypes ) {
    throw new Error( MODEL_NAME + ' Model must be imported using sequelize.import(\'path/to/' + MODEL_NAME + '.js\'');
}

const Thought = sequelize.define( MODEL_NAME, {
    userId: {
        type: dataTypes.INTEGER
    },
    name: {
        type: dataTypes.STRING
    },
    thought: {
        type: dataTypes.TEXT
    }
},
{
    hooks: {},
    freezeTableName: true,
    tableName : 'thoughts'
});


// Class Method
Thought.associate = function ( m ) {
    // associations can be defined here
    m.Thought.belongsTo(  m.User, { as : 'user', foreignKey: 'userId' });
};

/**
 * @name: getAll
 *
 * @description: Get all Thoughts
 * @param: {}
 * @return {object}
 * @api public
 */
Thought.getAll = function () {
    return this.findAll({
        include: [{ 
            model       : models.default.User, 
            as          : 'user', 
            required    : true 
        }]
    });
};

return Thought;

};`

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions