【问题标题】:Typescript Sequelize, M:M relation, query only returns single entryTypescript Sequelize,M:M 关系,查询只返回单个条目
【发布时间】:2018-07-10 03:08:16
【问题描述】:

我在 Node 中使用 NestJs 框架和 Sequelize Typescript,我试图在用户和网页之间创建多对多关系,其中许多用户可以在他们的收藏夹中拥有相同的网站。

现在我的问题是,当我进行查询时,它会将结果限制为单个条目,而使用完全相同的查询直接查询数据库会返回所有预期的条目。

这是我的 NestJs 收藏夹实体,我在其中定义了收藏夹表:

// 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
}

我是否在我的实体中犯了一些错误,或者可能是在我的 sequelize 查询中?

谢谢!

【问题讨论】:

    标签: node.js postgresql typescript sequelize.js nestjs


    【解决方案1】:

    如果您使用 findAll 而不是 find,您的结果是什么。但我同意查询看起来不错

    【讨论】:

    • 这成功了!我一开始也尝试过,但是 Typescript 编译器抱怨类型错误,这本身就是一个不同的问题。暂时忽略这一点,我得到了预期的结果。谢谢!
    • 关于类型错误,findAll时的类型错误是什么()
    • 查询正确。但是由于 findAll 返回一个数组,我需要将findByUserId(userId: number): Promise&lt;FavoriteEntity[] | null&gt; {} 添加到我的方法中。
    • FindAll 在没有结果且不为空时返回一个空数组
    • 啊,可能只是删除 null 然后因为空数组不是 ==(或 ===)为 null。谢谢!
    【解决方案2】:

    mottosson你确定同一个sql查询返回很多行吗?因为它会很奇怪。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 2021-05-14
      • 2016-08-25
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多