Typescript Sequelize,M:M 关系,仅查询 returns 单个条目
Typescript Sequelize, M:M relation, query only returns single entry
我正在为 Node 使用 NestJs framework with Sequelize Typescript,我试图在用户和网页之间创建多对多关系,在该网页中,许多用户可以在他们的收藏夹中拥有相同的站点。
现在我的问题是,当我进行查询时,它将结果限制为单个条目,同时使用完全相同的查询直接查询数据库 returns 所有预期的条目。
这是我的 NestJs 收藏夹实体,我在其中定义收藏夹 table:
// 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 查询中?
谢谢!
mottosson 你确定相同的 sql 查询 returns 多行吗?因为会很奇怪。
如果您使用 findAll
而不是 find
,您的结果是什么。但我同意查询看起来不错
我正在为 Node 使用 NestJs framework with Sequelize Typescript,我试图在用户和网页之间创建多对多关系,在该网页中,许多用户可以在他们的收藏夹中拥有相同的站点。
现在我的问题是,当我进行查询时,它将结果限制为单个条目,同时使用完全相同的查询直接查询数据库 returns 所有预期的条目。
这是我的 NestJs 收藏夹实体,我在其中定义收藏夹 table:
// 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 查询中?
谢谢!
mottosson 你确定相同的 sql 查询 returns 多行吗?因为会很奇怪。
如果您使用 findAll
而不是 find
,您的结果是什么。但我同意查询看起来不错