sequelize/sequelize-typescript - findAll 和 HasMany 返回一个对象而不是数组 [英] sequelize/sequelize-typescript - findAll with HasMany returns an object instead of an array

查看:210
本文介绍了sequelize/sequelize-typescript - findAll 和 HasMany 返回一个对象而不是数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 sequelize-typescript 建立一对多关系.但是当我尝试获取数据时,许多关系返回一个对象而不是数组

我有两张桌子.团队和球员.

团队可以有很多人,一个人属于一个团队.

我的模型:

@Table导出类 Team extends Model{@柱子名称:字符串@HasMany(() => Player)球员:球员[]}@桌子导出类 Player 扩展了 Model{@柱子名称:字符串@柱子数量:数量@ForeignKey(() => 团队)@柱子teamId:编号@BelongsTo(() => 团队)团队:团队}

当我跑步时:

Team.findAll({ include: [Player] })

我明白了:

<预><代码>[{身份证":1,"name": "我的团队","createdAt": "2020-06-17T14:23:03.000Z","updatedAt": "2020-06-17T14:23:03.000Z",玩家":{身份证":1,"name": "玩家一号",数量":10,团队ID":1,"createdAt": "2020-06-17T14:23:03.000Z","updatedAt": "2020-06-17T14:23:03.000Z"}},{身份证":1,"name": "我的团队","createdAt": "2020-06-17T14:23:03.000Z","updatedAt": "2020-06-17T14:23:03.000Z",玩家":{身份证":2,"name": "玩家二",数量":99,"teamId": 1,"createdAt": "2020-06-17T14:23:03.000Z","updatedAt": "2020-06-17T14:23:03.000Z"}}]

但我需要得到这个:

<预><代码>[{身份证":1,"name": "我的团队","createdAt": "2020-06-17T14:23:03.000Z","updatedAt": "2020-06-17T14:23:03.000Z",玩家":[{身份证":1,"name": "玩家一号",数量":10,"teamId": 1,"createdAt": "2020-06-17T14:23:03.000Z","updatedAt": "2020-06-17T14:23:03.000Z"},{身份证":2,"name": "玩家二",数量":99,团队ID":1,"createdAt": "2020-06-17T14:23:03.000Z","updatedAt": "2020-06-17T14:23:03.000Z"}]}]

我不知道是我做错了什么,或者是 sequelize-typescript 的问题,还是 sequelize 的问题.

有人可以帮我吗?

解决方案

如果您在查询选项中指定:raw: true,就会发生这种情况.

Team.findAll({包括: [播放器],raw: true//<-- 问题})

结果:

<预><代码>[{身份证":1,"name": "Team 1",players.id":1,"players.name": "玩家 1","players.num": 1,players.teamId":1},{身份证":1,"name": "Team 1",players.id":2,"players.name": "玩家 2","players.num": 2,players.teamId":1}]

删除它:

Team.findAll({包括: [播放器]})

结果:

<预><代码>[{身份证":1,"name":"Team 1",玩家":[{身份证":1,"name":"玩家 1",数量":1,团队 ID":1},{身份证":2,"name":"玩家 2",数量":2,团队 ID":1}]}]

I'm trying to make a one-to-many relationship using sequelize-typescript. But when I try to get the data, the relationship for many, returns me an object instead of an array

I have two tables. Team and Players.

Team can has many players, and a player belongs to a team.

My models:

@Table
export class Team extends Model<Team> {
  @Column
  name: string

  @HasMany(() => Player)
  players: Player[]
}

@Table
export class Player extends Model<Player> {
  @Column
  name: string

  @Column
  num: number

  @ForeignKey(() => Team)
  @Column
  teamId: number

  @BelongsTo(() => Team)
  team: Team
}

When I run:

Team.findAll({ include: [Player] })

I get this:

[
  {
    "id": 1,
    "name": "My Team",
    "createdAt": "2020-06-17T14:23:03.000Z",
    "updatedAt": "2020-06-17T14:23:03.000Z",
    "players": {
      "id": 1,
      "name": "Player One",
      "num": 10,
      "teamId": 1,
      "createdAt": "2020-06-17T14:23:03.000Z",
      "updatedAt": "2020-06-17T14:23:03.000Z"
    }
  },
  {
    "id": 1,
    "name": "My Team",
    "createdAt": "2020-06-17T14:23:03.000Z",
    "updatedAt": "2020-06-17T14:23:03.000Z",
    "players": {
      "id": 2,
      "name": "Player Two",
      "num": 99,
      "teamId": 1,
      "createdAt": "2020-06-17T14:23:03.000Z",
      "updatedAt": "2020-06-17T14:23:03.000Z"
    }
  }
]

but I need get this:

[
  {
    "id": 1,
    "name": "My Team",
    "createdAt": "2020-06-17T14:23:03.000Z",
    "updatedAt": "2020-06-17T14:23:03.000Z",
    "players": [
      {
        "id": 1,
        "name": "Player One",
        "num": 10,
        "teamId": 1,
        "createdAt": "2020-06-17T14:23:03.000Z",
        "updatedAt": "2020-06-17T14:23:03.000Z"
      },
      {
        "id": 2,
        "name": "Player Two",
        "num": 99,
        "teamId": 1,
        "createdAt": "2020-06-17T14:23:03.000Z",
        "updatedAt": "2020-06-17T14:23:03.000Z"
      }
    ]
  }
]

I don't know if I'm doing something wrong, or if it's a problem with sequelize-typescript, or if it's a problem with sequelize.

can anybody help me?

解决方案

This will happen if you specify: raw: true in the query options.

Team.findAll({
        include: [
            Player
        ],
        raw: true // <-- problem
    }
)

Results in:

[
  {
    "id": 1,
    "name": "Team 1",
    "players.id": 1,
    "players.name": "Player 1",
    "players.num": 1,
    "players.teamId": 1
  },
  {
    "id": 1,
    "name": "Team 1",
    "players.id": 2,
    "players.name": "Player 2",
    "players.num": 2,
    "players.teamId": 1
  }
]

Removing it:

Team.findAll({
        include: [
            Player
        ]
    }
)

Results in:

[
   {
      "id":1,
      "name":"Team 1",
      "players":[
         {
            "id":1,
            "name":"Player 1",
            "num":1,
            "teamId":1
         },
         {
            "id":2,
            "name":"Player 2",
            "num":2,
            "teamId":1
         }
      ]
   }
]

这篇关于sequelize/sequelize-typescript - findAll 和 HasMany 返回一个对象而不是数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆