gpt4 book ai didi

javascript - TypeORM:如何查询与字符串数组输入的多对多关系以查找所有字符串都应存在于相关实体列中的实体?

转载 作者:行者123 更新时间:2023-12-05 00:32:03 28 4
gpt4 key购买 nike

我有一个 UserProfile 具有 OneToOne 关系的实体实体和 Profile实体与 Category 具有多对多关系实体。

// user.entity.ts

@Entity()
export class User {
@PrimaryGeneratedColumn('uuid')
id: string;

@OneToOne(() => Profile, {
cascade: true,
nullable: true,
})
@JoinColumn() // user owns the relationship (User table contains profileId). Use it only on one side of the relationship
profile: Profile;
}
// profile.entity.ts

@Entity()
export class Profile {
@PrimaryGeneratedColumn('uuid')
id: number;

@OneToOne(() => User, (user: User) => user.profile)
user: User;

@ManyToMany(() => Category, (category: Category) => category, {
cascade: true,
nullable: true,
})
@JoinTable()
categories: Category[];
}
// category.entity.ts

@Entity()
export class Category {
@PrimaryGeneratedColumn('uuid')
id: number;

@Column()
name: string;

@ManyToMany(() => Profile, (profile: Profile) => profile.categories, {
nullable: true,
})
profiles: Profile[];
}
我的目标是获取所有用户实体,其中配置文件的类别名称都存在于字符串数组中作为输入,例如 const categories = ['category1', 'category2'] .到目前为止使用 IN使用查询生成器使我接近我的目标。
这是带有 IN 的查询:
const categories = ['category1', 'category2']

const users = await this.usersRepository
.createQueryBuilder('user')
.innerJoinAndSelect('user.profile', 'profile')
.innerJoinAndSelect('profile.categories', 'categories')
.where('categories.name IN (:...categories)', {
categories,
})
.getMany();
我只想要 category1 的用户和 category2作为配置文件的多对多关系的名称存在。通过上面的查询,我还收到了只有这些值之一作为名称存在的用户。我目前的结构甚至可以做到这一点吗?
This离我很近,但那里的 OP 有不相关的实体。
This也很接近,但它只是一个用于过滤的字符串数组列。
此外,我想保留我当前的结构,因为可能想向类别实体添加一些其他列,例如订单。
更新:
我决定使用字符串数组而不是多对多关系,因为它满足我自己的要求。
// profile.entity.ts

@Column('text', {
nullable: true,
array: true,
})
categories?: string[];
更新后的查询:
const categories = ['category1', 'category2']

const users = await this.usersRepository
.createQueryBuilder('user')
.innerJoinAndSelect('user.profile', 'profile')
.where('profile.categories::text[] @> (:categories)::text[]', {
categories,
})
.getMany();

最佳答案

如果你使用 PostgreSQL,你可以使用 @> contains array operator .

const categories = ['category1', 'category2']

// untested code
const users = await this.usersRepository
.createQueryBuilder('user')
.innerJoinAndSelect('user.profile', 'profile')
.innerJoin('profile.categories', 'categories')
.groupBy('user.id')
.addGroupBy('profile.id');
.having('array_agg(categories.name::text) @> ARRAY[:...categories]', {
categories,
})
.getMany();
它不选择类别,而是将连接的类别聚合到一个数组中,并检查它是否是给定数组的超集。我无法使用 TypeORM 对此进行测试,所以我只是希望它可以处理数组构建语法,因为我在文档中的任何地方都找不到它。我希望这个解决方案对您有所帮助。
编辑 :添加了缺少的 groupBy 和缺少的 Actor ,如评论中所述。

关于javascript - TypeORM:如何查询与字符串数组输入的多对多关系以查找所有字符串都应存在于相关实体列中的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70276169/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com