Sequelize Association получает данные, такие как JSON - PullRequest
0 голосов
/ 27 мая 2019

Я упростил мою проблему с двумя таблицами, такими как coconut и coconut_lists. В таблице Coconut хранятся спецификации магазина coconut и coconut_lists, в котором у продавца есть кокос. Каждый раз создается связь между продавцом и кокосом, которая вставляется в таблицу coconut_lists.

Я пытался использовать ключевое слово с атрибутами, устанавливая различные отношения HasMany, HasOne, BelongsToMany.

Coconut_List

import { Column, DataType, Model, Table, ForeignKey, BelongsTo } from 'sequelize-typescript';
import Coconut from './coconut';


@Table({
  modelName: 'cononuts_list',
  timestamps: true,
  paranoid: true,
})
export default class CoconutList extends Model<CoconutList> {
  @Column({
    allowNull: false,
    primaryKey: true,
    autoIncrement: true,
    type: DataType.INTEGER,
  })
  public id: number;

  @Column({
    type: DataType.STRING,
    allowNull: false,
  })
  public sellerId: string;

  @ForeignKey(() => coconut)
  @Column({
    type: DataType.INTEGER,
    allowNull: false,
  })
  public coconutId: number;

  @BelongsTo(() => Coconut, 'coconutId')
  public coconut: Coconut;


}

Кокосовое

import { Column, DataType, Model, Table, HasMany } from 'sequelize-typescript';
import CoconutList from './coconutList';


@Table({
  modelName: 'coconuts',
  timestamps: true,
  paranoid: true,
})
export default class Coconut extends Model<Coconut> {
  @Column({
    allowNull: false,
    primaryKey: true,
    autoIncrement: true,
    type: DataType.INTEGER,
  })
  public id: number;

  @HasMany(() => CoconutList, 'id')
  public coconutList: CoconutList[];

  @Column({
    type: DataType.INTEGER,
    allowNull: false,
  })
  public weight: number;

  @Column({
    type: DataType.INTEGER,
    allowNull: false,
  })
  public count: number;

  @Column({
    type: DataType.FLOAT,
    allowNull: false,
  })
  public size: number;
}

Запрос:

const coconutsBySeller = await CoconutList.findAll({
    include: [
      {
        model: Coconut,
        attributes: ['weight', 'size', 'count'],
      },
    ],
    attributes: ['sellerId'],
  });

Вывод кода выглядит следующим образом:

[
  {
    "sellerId": "f3ff90d8-ed8e-42c9-9c7b-d607111a359e",
    "coconut": {
      "weight": 100,
      "count": 6,
      "size": 11,
    }
  },
  {
    "sellerId": "f3ff90d8-ed8e-42c9-9c7b-d607111a359e",
    "coconut": {
      "weight": 200,
      "count": 12,
      "size": 20,
    }
  },
  {
    "sellerId": "ffffaaaa-ed8e-42c9-9c7b-d607111a359e",
    "coconut": {
      "weight": 300,
      "count": 18,
      "size": 50,
    }
  },
  {
    "sellerId": "ffffaaaa-ed8e-42c9-9c7b-d607111a359e",
    "coconut": {
      "weight": 100,
      "count": 6,
      "size": 11,
    }
  }
]

Вместо этого я хочу получить

[
  {
    "sellerId": "f3ff90d8-ed8e-42c9-9c7b-d607111a359e",
    [{
      "weight": 100,
      "count": 6,
      "size": 11,
    },
    {
      "weight": 200,
      "count": 12,
      "size": 20,
    }]
  },
  {
    "sellerId": "ffffaaaa-ed8e-42c9-9c7b-d607111a359e",
    [{
      "weight": 300,
      "count": 18,
      "size": 50,
},   
    {
      "weight": 100,
      "count": 6,
      "size": 11,
    }
  ]
]

В дополнение к формату данных мне также интересно узнать, возможно ли получить min_max значений полей веса, количества, размера кокосовых орехов, назначенных продавцу с помощью Sequelize в вышеупомянутом запросе.

1 Ответ

0 голосов
/ 27 мая 2019

Вы можете попробовать это для группировки продавцом:

const coconutsBySeller = await CoconutList.findAll({
    include: [
      {
        model: Coconut,
        attributes: ['weight', 'size', 'count'],
      },
    ],
    attributes: ['sellerId'],
    group: ['sellerId']
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...