如何使用带有嵌套对象和关系的Sequelize创建

问题描述 投票:1回答:1

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

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

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

    models.User.create(
    {
      username: 'ddavids',
      email: '[email protected]',
      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只是为了进行更改时创建一些虚假数据。因此,如果有更好的方式来播种数据库,那将是我的最终目标。

javascript node.js orm sequelize.js relational-database
1个回答
0
投票
locations: { locationName: 'floor' }location: { 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: '[email protected]', 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  | [email protected] | 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": "^5.21.3",

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

© www.soinside.com 2019 - 2024. All rights reserved.