javascript - 如何使用 Sequelize 创建嵌套对象和关系

标签 javascript node.js orm sequelize.js relational-database

我有 3 个模型。用户、项目和位置。

User.hasMany(Item)
Location.hasMany(Item)
Item.belongsTo(User)
Item.belongsTo(Location)

此操作会运行,但不会在位置表中创建位置外键或位置行。

    models.User.create(
    {
      username: 'ddavids',
      email: 'hello@david.com',
      password: '12345678',
      items: [
        {
          itemName: 'Good Book',
          orderDate: '2020-01-20',
          locations: { locationName: 'floor' }
        },
        {
          itemName: 'Bad Book',
          orderDate: '2020-01-21',
          locations: { locationName: 'shelf' }
        }
      ]
    },
    {
      include: [{ model: models.Item, include: [models.Location] }]
    }
   )

这会正确创建项目和位置,但显然不在用户下。

    models.Location.create(
    {
      locationName: 'floor',
      items: [
        {
          itemName: 'Good Book',
          orderDate: '2020-01-20',
          locations: { locationName: 'floor' }
        },
        {
          itemName: 'Bad Book',
          orderDate: '2020-01-21',
          locations: { locationName: 'shelf' }
        }
      ]
    },
    { include: [models.Item] }
   )

我不明白的是,我的关系是否采取了错误的方式来解决这个问题,或者它是否是创作的限制,我应该继续前进还是什么。 我的最终目标是这样的。

 User.hasMany(Order)
 Order.belongsTo(User)
 Order.hasMany(Item)
 Item.belongsTo(Order)
 Location.hasMany(Item)
 Item.belongsTo(location)
 Supplier.hasMany(Item)
 Item.belongsTo(Supplier)

我目前使用 create 只是为了在进行更改时创建一些假数据。因此,如果有更好的方法来为数据库提供种子,这将是我的最终目标。

最佳答案

因为LocationItem模型的关联是一对多的。所以你应该改变

地点:{ locationName:'floor' }地点:{ locationName:'floor' }Item 的位置不应该是复数。这意味着每一项都属于一个位置。

这是工作示例:

index.ts:

import { sequelize } from '../../db';
import { Model, DataTypes } from 'sequelize';

class User extends Model {}
User.init(
  {
    username: DataTypes.STRING,
    email: DataTypes.STRING,
    password: DataTypes.STRING,
  },
  { sequelize, modelName: 'user' },
);

class Location extends Model {}
Location.init(
  {
    locationName: DataTypes.STRING,
  },
  { sequelize, modelName: 'location' },
);

class Item extends Model {}
Item.init(
  {
    itemName: DataTypes.STRING,
    orderDate: DataTypes.STRING,
  },
  { sequelize, modelName: 'item' },
);

User.hasMany(Item);
Location.hasMany(Item);
Item.belongsTo(User);
Item.belongsTo(Location);

(async function test() {
  try {
    await sequelize.sync({ force: true });
    await User.create(
      {
        username: 'ddavids',
        email: 'hello@david.com',
        password: '12345678',
        items: [
          {
            itemName: 'Good Book',
            orderDate: '2020-01-20',
            location: { locationName: 'floor' },
          },
          {
            itemName: 'Bad Book',
            orderDate: '2020-01-21',
            location: { locationName: 'shelf' },
          },
        ],
      },
      {
        include: [{ model: Item, include: [Location] }],
      },
    );
  } catch (error) {
    console.log(error);
  } finally {
    await sequelize.close();
  }
})();

执行上述代码后,查看数据库中的数据记录:

node-sequelize-examples=# select * from "user";
 id | username |      email      | password
----+----------+-----------------+----------
  1 | ddavids  | hello@david.com | 12345678
(1 row)

node-sequelize-examples=# select * from "location";
 id | locationName
----+--------------
  1 | floor
  2 | shelf
(2 rows)

node-sequelize-examples=# select * from "item";
 id | itemName  | orderDate  | userId | locationId
----+-----------+------------+--------+------------
  1 | Good Book | 2020-01-20 |      1 |          1
  2 | Bad Book  | 2020-01-21 |      1 |          2
(2 rows)

按预期插入数据记录。

Sequelize 版本:"sequelize": "^5.21.3",

源代码:https://github.com/mrdulin/node-sequelize-examples/tree/master/src/examples/stackoverflow/59937776

关于javascript - 如何使用 Sequelize 创建嵌套对象和关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59937776/

相关文章:

javascript - Facebook javascript 与 RoR 集成不起作用

javascript - $animate addClass 在 Angular 1.3 中不起作用

node.js - 'process.nextTick(function() { throw err; })' - 未定义不是函数(mongodb/mongoose)

database - 一组外键,其中除了一个外都是 NULL

java - 需要帮助创建 hbm.xml

javascript - 如何从传递的表中获取行数?

javascript - polymer dom-repeat 数据上下文未设置

linux - 从 GitHub : support/node-builds-v4/node-linux64: Permission denied 安装 Cloud9 时出现问题

ios - React Native Socket.io 如何从设备连接到本地 Node 服务器

android - 如何在执行 InsertOrReplace 时解决 greenDAO "No such table exists error"?