Sequelize ассоциации никогда не создаются - PullRequest
0 голосов
/ 24 октября 2018

Я был стеком уже неделю, пытаясь исправить связь с секвелированием.Я искал в Интернете решение, но похоже, что ни у кого не было такой же проблемы, как у меня.Когда я добавляю ассоциации в модели, он вообще не создается.принадлежность Никогда не добавляет поле внешнего ключа в связанную таблицу.Я поделился своей схемой в деталях, надеясь, что кто-то там поможет мне решить проблему.Я также попытался добавить внешние ключи непосредственно в модели и миграции, но безуспешно.

У меня есть 4 модели: Пользователь, Роль, Разрешение и Пост.У пользователя есть много сообщений, пользователь принадлежит ToMany ролям через таблицу соединений RoleUser , а роль принадлежит пользователям ToMany через таблицу соединений RoleUser.Разрешения принадлежит toMany ролям через PermissionRol таблица соединений.

//User Model
'use strict';
module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    id: {type:DataTypes.UUID,allowNull:false,unique:true,primaryKey:true},
    UserName: {type:DataTypes.STRING,unique:true,allowNull:false},
    Email: {type:DataTypes.STRING,allowNull:false,unique:true,validate: { isEmail: {msg: "Invalid Email"} }},
    Password: {type:DataTypes.STRING,allowNull:false}

  }, {});
  User.associate = function(models) {
    User.hasMany(models.Post,
        {
            foreignKey:'UserId',
            as:'posts',
            sourceKey:'id'
        }),

      User.belongsToMany(models.Role,
            {
        through: 'RoleUser',
        foreignkey:'UserId'

    })


 };
  return User;
};

//Post model

'use strict';
module.exports = (sequelize, DataTypes) => {
  const Post = sequelize.define('Post', {
    id: {type:DataTypes.UUID,allowNull:false,unique:true,primaryKey:true},
    Title: DataTypes.STRING,
    Post: DataTypes.TEXT
  }, {});
  Post.associate = function(models) {
 Post.belongTo(models.User,
    {
        foreignKey:'UserId',
        sourceKey:'id'
    })


  };
  return Post;
};

//Role Model

'use strict';
module.exports = (sequelize, DataTypes) => {
  const RoleUser = sequelize.define('RoleUser', {
    RoleId: {type:DataTypes.UUID,allowNull:false,primaryKey:true},
    UserId: {type:DataTypes.UUID,allowNull:false,primaryKey:true},

  }, {});
  RoleUser.associate = function(models) {
    // associations can be defined here

    RoleUser.belongsTo(models.User,{foreignKey:'UserId'}),
    RoleUser.belongsTo(models.Role,{foreignKey:'RoleId'})
  };
  return RoleUser;
};

//Permission Model

'use strict';
module.exports = (sequelize, DataTypes) => {
  const Permission = sequelize.define('Permission', {
    id: {type:DataTypes.UUID,allowNull:false,unique:true,primaryKey:true},
    Name: DataTypes.STRING,
    Description: DataTypes.STRING
  }, {});
  Permission.associate = function(models) {
    // associations can be defined here

    Permission.belongsToMany(models.Role,
        {
            through:'PermissionRole',
            foreignKey:'PermissionId'

        })

  };
  return Permission;
};

ТАБЛИЦА МИГРАЦИЙ

//users

'use strict';
const uuidv4 = require('uuid/v4');

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        primaryKey: true,
        type: Sequelize.UUID
        defaultValue:uuidv4()
      },
      UserName: {
        type: Sequelize.STRING
      },

      Email: {
        type: Sequelize.STRING
      },
      Password: {
        type: Sequelize.STRING
      },

      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Users');
  }
};

//Post migration

'use strict';
const uuidv4 = require('uuid/v4');
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('posts', {
      id: {
        allowNull: false,
        primaryKey: true,
        type: Sequelize.UUID,
        defaultValue:uuidv4()
      },
      Title: {
        type: Sequelize.STRING
      },
      Post: {
        type: Sequelize.Text
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('CourseCategories');
  }
};

//Role migration

'use strict';
const uuidv4 = require('uuid/v4');
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Roles', {
      id: {
        allowNull: false,
        primaryKey: true,
        type: Sequelize.UUID,
        defaultValue:uuidv4()
      },
      Name: {
        type: Sequelize.STRING
      },
      Description: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Roles');
  }
};

//Permission migration

'use strict';
const uuidv4 = require('uuid/v4');

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Permissions', {
      id: {
        allowNull: false,
        primaryKey: true,
        type: Sequelize.UUID,
        defaultValue:uuidv4()
      },
      Name: {
        type: Sequelize.STRING
      },
      Description: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Permissions');
  }
};

После запускамиграции, все таблицы создаются как ожидалось.Даже распределительные таблицы roleuser и разрешение создаются sequelize.

Однако внешние ключи не добавляются.Например, таблица записей не имеет ожидаемого идентификатора пользователя ForeignKey

, когда я просматриваю таблицы в представлении отношений PhpMyAdmin, между таблицами не существует внешних ключей или отношений.

, когда я пытаюсь выполнить запрос исписок ролей с разрешениями, связанными с каждой ролью, как показано ниже, я получаю эту ошибку:

 SequelizeEagerLoadingError: Permission is not associated to Role!

Вот мой запрос:

exports.rolesWithPermissions = function(req, res){
Role.findAll({
  include:[{model:Permission}]
}).then((roleperms)=>{
  return res.json({status:200,roleperms:roleperms});
}).catch((error)=>{
  console.log(error);
  return res.send({error:error.error});
});

};

Я получаю похожую ошибку при получении пользователей с сообщениями.Короче говоря, отношения (ассоциации) никогда не создаются.Я использую MySQL диалект с Sequelize версии 4.31.2 .Даже я пытался использовать Sqlite с теми же результатами.

Я также пытался переустановить сиквелиз без удачи.Что я могу делать не так, любезно помогите.

...