【问题标题】:Postgres and TypeORM WHERE clause filters JOIN tablePostgres 和 TypeORM WHERE 子句过滤 JOIN 表
【发布时间】:2020-09-21 18:18:45
【问题描述】:

大家好,我正在尝试使用 TypeORM 和 postgres 从数据库中查询一些用户。

我有两个模型:UsersGrades,这是一对多的关系,User可以有多个等级

用户模型:

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,
    Column,
    PrimaryGeneratedColumn,
    ManyToOne,
} 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)

【问题讨论】:

  • 与您的问题无关,但是:Postgres 9.1 是no longer supported,您应该尽快计划升级。
  • 我错误地添加了那个标签,谢谢..现在修复它
  • 9.4 也不再支持
  • 您能添加您的实体吗?而且我不确定我是否了解您到底想做什么。您要选择至少一个成绩为 5 的用户?
  • @noamsteiner 嗨,我添加了模型,我遇到的问题是我的 where 子句也过滤了成绩,但我只想按成绩过滤用户,并保留所有成绩

标签: postgresql typeorm


【解决方案1】:

首先了解联接类型很重要,您使用了INNER JOIN,它始终只返回用户和成绩的交集。

要选择所有等级并仅对值为5的等级加入用户,您应该使用RIGHT JOIN,因此表1为users,表2为grades,交集将是具有等级的用户5 及以上。

但是

由于 typeorm 的 github 中的 this comment,在使用 ORM 时无法实现 RIGHT JOIN

你能做什么?

  1. 选择所有等级和LEFT JOIN具有等级值条件的用户:

Tadble 1 是 grades,表 2 是 users

this.createQueryBuilder('grades')
            .leftJoinAndSelect('grades.user', 'user', 'grades.value IN (:5)')
            .getMany();

  1. 您可以编写原始查询,例如:
this.gardesRepository.query(`
    SELECT * FROM grades
    RIGHT JOIN users ON grades.user_id = users.id AND grades.value IN (:5);
`)
       

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    相关资源
    最近更新 更多