问题描述
嗨,我正在尝试将TypeORM与postgres结合使用,以从数据库中查询某些用户。
我有两个模型:用户和成绩,它一对多的关系,用户可以有多个成绩
用户模型:
import {
Entity,Column,PrimaryGeneratedColumn,ManyToOne,OneToMany,Index,} from 'typeorm';
import { Grade } from './grade.entity';
@Entity('users')
export class User {
@PrimaryGeneratedColumn({ name: 'id',type: 'integer' })
id: number;
@Index()
@Column()
name: string;
@Column()
surname: string;
@OneToMany(() => Grade,(grade) => grade.user,{
onUpdate: 'CASCADE',onDelete: 'CASCADE',cascade: true,})
grades: Grades[];
}
成绩模型。
import {
Entity,} from 'typeorm';
import { User } from './User.entity';
@Entity('grades')
export class Grade {
@PrimaryGeneratedColumn({ name: 'id',type: 'integer' })
id: number;
@Column()
value: string;
@ManyToOne(() => User,(asset) => user.grades)
user: User;
}
我有以下查询:
this.createQueryBuilder('users')
.innerJoinAndSelect('users.grades','grade')
.where('grade.value IN (:5)',{ ips })
.getMany();
问题在于,运行查询时,它还会过滤用户内部的成绩
所以我有多个用户和这样的等级:
Users(name: 'John',surname: 'Doe')(name: 'Stiv',surname: 'Jovic ') and grades -> ( value: 1 ),( value:2 ),( value: 3 ),( value:4 ),( value:5),( value:6),( value:2)
我想获得所有5年级的用户,所以我是这样的:
User(name: 'John) => grades (value: 1),(value: 2),(value: 5)
但是知道我获得了5级用户,但是它也过滤了联接表,所以我得到了这样的数据:
User(name: 'John') => grades (value:5)
解决方法
首先,重要的是要了解联接类型,您使用了INNER JOIN
,它将始终只返回用户和成绩的交集。
要选择所有成绩并仅加入值为5的成绩的用户,应使用RIGHT JOIN
,以便表1为users
,表2为grades
,交集将是5年级以上的用户。
但是
由于typeorm的github中的this comment,在使用ORM时无法实现RIGHT JOIN
。
比你能做什么?
- 选择所有成绩和具有该成绩值条件的
LEFT JOIN
用户:
表1是grades
,表2是users
。
this.createQueryBuilder('grades')
.leftJoinAndSelect('grades.user','user','grades.value IN (:5)')
.getMany();
- 您可以编写原始查询,例如:
this.gardesRepository.query(`
SELECT * FROM grades
RIGHT JOIN users ON grades.user_id = users.id AND grades.value IN (:5);
`)