簡體   English   中英

在 Sequelize 中有一個關聯

[英]Has one association in Sequelize

我有一個用戶 Model 與角色 Model 的 hasOne 關系

User.init({
    id: {
        type: DataTypes.INTEGER.UNSIGNED,
        autoIncrement: true,
        primaryKey: true
    },
    name: {
        type: DataTypes.STRING,
        allowNull: false
    },
    //email, password, and other fields, ...
    roleId: {
        type:DataTypes.INTEGER,
        allowNull: false
    }}, 
    {
        sequelize,
        tableName: "Users"
    });
User.hasOne(Role)

和一個角色 Model

Role.init({
    id: {
        type: DataTypes.INTEGER.UNSIGNED,
        autoIncrement: true,
        primaryKey: true
    },
    name: {
        type: DataTypes.STRING,
        allowNull: false
    }}, 
    {
        sequelize,
        tableName: "Roles"
    });

當我嘗試創建一個新角色時

await Role.create(req.body)

請求是

POST http://localhost:3000/api/role
Content-Type: application/json
Authorization: Bearer <token>

{
    "name": "test role"
}

我收到錯誤column "UserId" does not exist

日志說是:

routine: 'errorMissingColumn',
sql: 'INSERT INTO "Roles" ("id","name") VALUES (DEFAULT,$1) RETURNING "id","name","UserId";',
parameters: [
  'test role'
]

我在這里做錯了什么? 我的表只有Users表中的roleIdRoles表中的UserId是哪里來的?

遷移

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Roles', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
            type: Sequelize.STRING,
            allowNull: false
        }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Roles');
  }
};


'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        type: Sequelize.STRING
      },
      // other fields   
      roleId: {
          type: Sequelize.INTEGER,
          references: {
              model: "Roles",
              key: "id"
          }
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Users');
  }
};

如果我在角色 Model 中添加Role.belongsTo(User) ,則會收到錯誤消息:

models init error: TypeError: Cannot read property 'name' of undefined

對於要按照架構建議存儲在用戶表中的角色: User.belongsTo(Role)將為您設置映射RoleId

Model 以與遷移相反的方式設置外鍵,因此導致缺少UserID列。

除非您想自定義字段,否則不需要在架構中定義外鍵。 然后在關聯調用上定義belongsTo / hasOne選項。

const { Sequelize, Model, DataTypes } = require('sequelize')
const sequelize = new Sequelize('sqlite::memory:')

class User extends Model {}
class Role extends Model {}

User.init({
    id: {
        type: DataTypes.INTEGER.UNSIGNED,
        autoIncrement: true,
        primaryKey: true
    },
    name: {
        type: DataTypes.STRING,
        allowNull: false
    }}, 
    {
        sequelize,
        tableName: "Users"
    });

Role.init({
    id: {
        type: DataTypes.INTEGER.UNSIGNED,
        autoIncrement: true,
        primaryKey: true
    },
    name: {
        type: DataTypes.STRING,
        allowNull: false
    }}, 
    {
        sequelize,
        tableName: "Roles"
    });

User.belongsTo(Role, { foreignKey: 'roleId' })

然后你可以用協會做事

async function go(){
  await sequelize.sync()
  const role = await Role.create({ name: 'atester' })
  const user = await User.create({ name: 'test' })
  await user.setRole(role)
  
  console.log("%j", await User.findAll({ include: Role }))
}

go().catch(console.error)

結果生成如下文件:

{
  "id": 1,
  "name": "test",
  "createdAt": "2020-12-04T09:44:05.762Z",
  "updatedAt": "2020-12-04T09:44:05.763Z",
  "roleId": 1,
  "Role": {
    "id": 1,
    "name": "atester",
    "createdAt": "2020-12-04T09:44:05.758Z",
    "updatedAt": "2020-12-04T09:44:05.758Z"
  }
}

從那里您可以將遷移匹配到數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM