【问题标题】:TypeORM createQueryBuilder can't manage a JOINTypeORM createQueryBuilder 无法管理 JOIN
【发布时间】:2019-08-22 02:02:30
【问题描述】:

我是 TypeORM 的新手。 我正在使用节点、打字稿、TypeORM 和 MySQL。 我不知道 JOIN 和 createQueryBuilder 在 TypeORM 中是如何工作的。

我有一个带有 user_id 字段的 Response 表,它与 User 表的 id 字段匹配。 关系是 response.user_id = user.id,在一对多关系中。 而且我不知道它如何与 TypeORM 一起工作

import { Entity, Column, PrimaryColumn, PrimaryGeneratedColumn, OneToMany } from 'typeorm';
import { User } from '../User/User';

@Entity("response")
export class Response {

  @PrimaryColumn("varchar", { length: 80, unique: true, primary: true })
  public id: string;

  @PrimaryGeneratedColumn()
  public bk_id: number;

  @Column("varchar", { length: 80 })
  public user_id: string;

  @Column("varchar", { length: 80 })
  public parent_request_id: string;

  @Column("text")
  public description: string;

  @Column("integer")
  public status_id: number;  

  @Column("integer")
  public deleted: number;

  @Column("timestamp")
  public created_on: Date;

  @Column("timestamp")
  public last_update: Date;

  @OneToMany(type => User, user => user.id)
    users: User[];
}

和用户:

import { Entity, Column, PrimaryColumn, ManyToOne } from 'typeorm';
import { Response } from '../Response/Response';

@Entity("user")
export class User {

  @PrimaryColumn("varchar", { length: 50, unique: true, primary: true })
  public id: string;

  @Column("varchar", { length: 255, unique: true })
  public username: string;

  @Column("varchar", { length: 255 })
  public password: string;

  @Column("varchar", { length: 150 })
  public first_name: string;

  @Column("varchar", { length: 255 })
  public last_name: string;

  @Column("varchar", { length: 355, unique: true })
  public email: string;
  
  @Column("timestamp")
  public created_on: Date;

  @Column("integer")
  public userstatus_id: number;  

  @Column("integer")
  public deleted: number;

  @Column("timestamp")
  public last_login: Date;

  @ManyToOne(type => Response, response => response.user_id)
  response: Response;
}

而我的Sql语句是这样的:

   const result = await this.entityManager
   .createQueryBuilder('Response')
   .leftJoinAndSelect(
     'Response.user_id',
     'user',
     'user.id = :id',
     { id: 'user_id' },
   )
   .where('response.parent_request_id = :parent_request_id', { parentRequestId });

我收到了错误:

"Response" alias was not found. Maybe you forgot to join it?

感谢任何帮助。

非常感谢。

【问题讨论】:

    标签: mysql node.js typescript typeorm


    【解决方案1】:

    可能是因为:

    const result = await this.entityManager
    .createQueryBuilder('Response') // << entity with '' and lacking alias
    .leftJoinAndSelect(
      'Response.user_id',
      'user',
      'user.id = :id',
      { id: 'user_id' }, // < with '' would set as string (user_id)
    )
    .where('response.parent_request_id = :parent_request_id', { parentRequestId }); // < you forgot to declare param
    

    您可以尝试以下方法:

    const result = await this.entityManager
    .createQueryBuilder(Response, 'response')
    .leftJoinAndSelect(
      'response.user_id',
      'user',
      'user.id = :id',
      { id: user_id }, // assuming you're using user_id as variable
    )
    .where('response.parent_request_id = :parent_request_id', { parent_request_id: parentRequestId });
    

    【讨论】:

    • 谢谢。你的解决方案不适合我,所以我很着急,我更喜欢使用 SQL 查询来构建它。
    • 如果你使用 user_id from response.user_id 那么你可以使用user.id = response.user_id
    【解决方案2】:

    我终于使用了 Sql Query,而不是 Query builder。 我认为查询构建器的构造非常棘手,所以我更喜欢全部掌握在我手中。这是我的解决方案:

    this.entityManager.query(
            `SELECT r.*, u.first_name, u.last_name, u.email, u.deleted, u.username, u.userstatus_id FROM knowhow.response as r
            LEFT JOIN user as u on u.id = r.user_id
            WHERE r.parent_request_id = '${parentRequestId}'`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-27
      • 2022-07-07
      • 2021-12-31
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 2021-10-10
      • 2014-09-13
      相关资源
      最近更新 更多