Typescript Sequelize, отношение M:M, запрос возвращает только одну запись

Я использую структуру NestJs с Sequelize Typescript для Node, где я пытаюсь создать отношение "многие ко многим" между пользователем и веб-страницей, где у многих пользователей один и тот же сайт может быть в избранном.

Теперь моя проблема заключается в том, что когда я делаю запрос, он ограничивает результат одной записью, в то время как прямой запрос к базе данных с точно таким же запросом возвращает все ожидаемые записи.

Это мой объект избранного NestJ, в котором я определяю любимую таблицу:

// favorite.entity.ts

import { Table, Column, Model, PrimaryKey, ForeignKey, BelongsTo, NotNull } from "sequelize-typescript";
import { IDefineOptions } from "sequelize-typescript/lib/interfaces/IDefineOptions";
import { UserEntity } from "../users/user.entity";
import { SiteEntity } from "../sites/site.entity";

const tableOptions: IDefineOptions = {
  timestamp: true,
  tableName: "favorites",
  schema: process.env.DB_SCHEMA,
} as IDefineOptions;

@Table(tableOptions)
export class FavoriteEntity extends Model<FavoriteEntity> {
  @BelongsTo(() => UserEntity)
  user: UserEntity;

  @ForeignKey(() => UserEntity)
  @PrimaryKey
  @NotNull
  @Column
  userId: number;

  @BelongsTo(() => SiteEntity)
  site: SiteEntity;

  @ForeignKey(() => SiteEntity)
  @PrimaryKey
  @NotNull
  @Column
  siteId: number;
}

И мой сервис, где я делаю запрос Sequelize:

// favorite.service.ts

import { Inject, Injectable } from "@nestjs/common";
import { Model } from "sequelize-typescript";
import { IFavoriteService } from "./interfaces";
import { FavoriteEntity } from "./favorite.entity";

@Injectable()
export class FavoriteService implements IFavoriteService {
  constructor(
    @Inject("FavoriteRepository") private readonly favoriteRepository: typeof Model,
    @Inject("SequelizeInstance") private readonly sequelizeInstance,
  ) {}

  public async findByUserId(userId: number): Promise<FavoriteEntity | null> {
    return await FavoriteEntity.scope().find<FavoriteEntity>({
      logging: console.log,
      where: { userId },
    });
  }
}

Вышедший из системы оператор SQL:

Executing (default): SELECT "userId", "siteId" FROM "public"."favorites" AS "FavoriteEntity" WHERE "FavoriteEntity"."userId" = '1';

И в результате получается одна запись (в БД много строк)...

{
    "userId": 1,
    "siteId": 1650
}

Я сделал какую-то ошибку в своей сущности или это может быть в моем запросе на продолжение?

Спасибо!


person mottosson    schedule 05.07.2018    source источник


Ответы (2)


каков ваш результат, если вы используете findAll вместо find. но я согласен, что запрос выглядит красиво

person Adrien De Peretti    schedule 09.07.2018
comment
Это сработало! Сначала я тоже попробовал, но компилятор Typescript жаловался на ошибку типа, что само по себе является другой проблемой. Просто игнорируя это на данный момент, я получил ожидаемый результат. Спасибо! - person mottosson; 17.07.2018
comment
А насчет ошибки типа, что это за ошибка типа, когда вы делаете findAll‹ModelName›() - person Adrien De Peretti; 17.07.2018
comment
Запрос правильный. Но поскольку findAll возвращает массив, мне нужно было добавить findByUserId(userId: number): Promise<FavoriteEntity[] | null> {} к моему методу. - person mottosson; 17.07.2018
comment
FindAll возвращает пустой массив, когда нет результата, а не null - person Adrien De Peretti; 17.07.2018
comment
Ах, может просто удалить нуль, тогда как пустой массив не равен == (или ===) нулю. Спасибо! - person mottosson; 17.07.2018

mottosson Вы уверены, что один и тот же SQL-запрос возвращает много строк? Потому что это будет странно.

person cojack    schedule 08.07.2018