【问题标题】:typeorm leftjoin remove parent resultstypeorm leftjoin 删除父结果
【发布时间】:2020-05-02 14:32:29
【问题描述】:

我正在使用 typeorm,在查询构建器中使用 leftjoin 命令时,它似乎删除了父结果: '''

var user = await getRepository(Users).createQueryBuilder("user")
            .where("user.user_id = :user_id", { user_id: user_id })
            .andWhere("user.token = :u_token", { u_token: u_token })
            .leftJoinAndSelect("user.devices", "device")
            .where("device.token = :d_token", { d_token: d_token })
            .andWhere("device.code_tries <= 3")
            .andWhere("device.status = 0")
            .getMany();

''' 只有存在有效设备时才会返回用户,如果没有找到设备则不会返回“用户”。

顺便说一句,通过删除所有“leftjoin”部分,无论如何都会返回用户对象。 像这样: '''

var user = await getRepository(Users).createQueryBuilder("user")
            .where("user.user_id = :user_id", { user_id: user_id })
            .andWhere("user.token = :u_token", { u_token: u_token })
            .getMany();

'''

左连接应该返回所有用户和匹配的设备(据我所知)。 为什么会这样?

【问题讨论】:

  • 只是为了明确,问题是如果没有匹配的设备..用户根本没有返回..在我的第二个代码段中,具有相同的“用户”选择义务,用户返回。

标签: node.js typeorm


【解决方案1】:

这里的问题是你的查询,你可能认为leftJoinAndSelect之后的where子句只适用于设备,但实际上和这个是一样的:

var user = await getRepository(Users).createQueryBuilder("user")
            .leftJoinAndSelect("user.devices", "device")
            .where("user.user_id = :user_id", { user_id: user_id })
            .andWhere("user.token = :u_token", { u_token: u_token })
            .where("device.token = :d_token", { d_token: d_token })
            .andWhere("device.code_tries <= 3")
            .andWhere("device.status = 0")
            .getMany();

您需要的是子查询之类的东西,实现它的一种方法是使用 leftJoinAndMapMany:

const query = getRepository(Users).createQueryBuilder("user")
              .leftJoinAndSelect("user.devices", "device")
              where("user.user_id = :user_id", { user_id: user_id });

const condition = 'device.token = :d_token && device.code_tries <= 3 && device.status = 0';
query.leftJoinAndMapMany('user.devices', Device, 'device', condition, {
        d_token: d_token
    });
user = await query.getMany();

【讨论】:

  • 首先,谢谢..它不返回任何设备,并且您从查询中删除了“u_token”代表用户令牌..无论如何,即使我把它带回来,它只返回没有连接设备的用户。根据你的解释,顺序似乎不是问题,因为我指定“设备”是左连接别名的一部分..想法?
猜你喜欢
  • 2021-04-15
  • 2021-02-21
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 2017-04-25
  • 2021-11-13
  • 2020-06-17
  • 1970-01-01
相关资源
最近更新 更多