Получить те сущности, у которых дочерняя связь имеет все перечисленные значения? (TypeOrm, SQL)
Как получить те сущности, у которых дочерняя связь имеет все перечисленные значения?
В данные момент возвращаются те, у которых дочерняя связь имеют любое из перечисленных значений.
const qb = this.postRepository.createQueryBuilder('p');
qb.leftJoin('p.tags', 'tags');
Такие поиски ищут одно любое совпадение:
1:
qb.where(`tags.content ILIKE ANY(ARRAY[:...tags])`, {tags: tags});
2:
qb.where(`tags.content IN (:...tags)`, {tags: tags});
ALL вместо ANY тоже не дает результат.
Типизация сущностей такая:
Post:
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@OneToMany(() => Tag, (tags) => tags.post)
@JoinColumn({ name: 'tags_id' })
tags: Tag[];
}
Tag:
@Entity()
export class Tag {
@PrimaryGeneratedColumn()
id: number;
@Column()
content: string;
@ManyToOne(() => Post, (post) => post.tags, {
orphanedRowAction: 'delete',
})
post: Relation<Post>;
}
Ответы (1 шт):
Автор решения: En Kratia
→ Ссылка
@Akina дал ответ для sql в комментарии.
Typeorm версия ответа выглядит так:
qb.where(`tags.content IN (:...tags)`, { tags: ['tag1', 'tag2'] });
qb.having(`COUNT(DISTINCT tags.content) = :length`, { length: 2 });
qb.groupBy('p.id, tags.id');