繁体   English   中英

查询 TypeOrm 中的绑定值

[英]Binding values in query TypeOrm

我目前正在 NestJS 中设计一个聊天,您可以在其中向其他用户发送私人消息。

我有一个存储库私人消息,其中包含两个用户之间的每条消息,我在其上构建查询,但我想绑定值以使其更具可读性。

我有这个代码:

    public async getPrivateMessage(sender: string, target: string)
    {
        let user1: User = await this.userService.getUserByIdentifier(sender);
        let user2: User = await this.userService.getUserByIdentifier(target);


        const msgs = this.pmRepo.createQueryBuilder("PM")
            .where(new Brackets(qb => {
                qb.where("PM.sender = :dst", { dst: user1.id })
                .orWhere("PM.sender = :dst1", { dst1: user2.id })
            }))
            .andWhere(new Brackets(qb => {
                qb.where("PM.target = :dst", { dst: user1.id })
                .orWhere("PM.target = :dst1", { dst1: user2.id })
            }))
            .getMany();
        return msgs;
    }

...返回以下 JSON :

[
    {
        "id": 1,
        "message": "test0 ",
        "sender": "04c40d7b-bf0c-4d7d-a6c1-4ec93f9bb472",
        "target": "617c1640-b0df-448e-8b55-a67131e77456"
    },
    {
        "id": 2,
        "message": "test1 ",
        "sender": "04c40d7b-bf0c-4d7d-a6c1-4ec93f9bb472",
        "target": "617c1640-b0df-448e-8b55-a67131e77456"
    },

我希望它显示名称而不是 ID,例如

[
    {
        "id": 1,
        "message": "test0 ",
        "sender": "name of sender",
        "target": "name of target"
    },

...知道此数据由我的 user1 和 user2(User 类的对象)保存在字段“名称”中。 我想将字段 sender 和 target 绑定到一个名称,但真的不知道在哪里寻找。

[编辑]

在回答之后,我编辑了代码并尝试了类似的东西:

const msgs = this.pmRepo.createQueryBuilder("PM")
            .leftJoinAndSelect(User, 'user', 'user.id = PM.sender')
            .where(new Brackets(qb => {
                qb.where("PM.sender = :dst", { dst: user1.id })
                    .orWhere("PM.sender = :dst1", { dst1: user2.id })
            }))
            .andWhere(new Brackets(qb => {
                qb.where("PM.target = :dst", { dst: user1.id })
                    .orWhere("PM.target = :dst1", { dst1: user2.id })
            }))
            .getMany();

至少有 sender 对象。

不幸的是,我仍然有相同的输出。 这是执行的 SQL 查询:

query: SELECT "PM"."id" AS "PM_id", "PM"."message" AS "PM_message", "PM"."sender" AS "PM_sender", "PM"."target" AS "PM_target", "user"."id" AS "user_id", "user"."name" AS "user_name", "user"."mail" AS "user_mail" FROM "privateMessage" "PM" LEFT JOIN "Users" "user" ON "user"."id" = "PM"."sender" WHERE ("PM"."sender" = $1 OR "PM"."sender" = $2) AND ("PM"."target" = $3 OR "PM"."target" = $4) -- PARAMETERS: ["04c40d7b-bf0c-4d7d-a6c1-4ec93f9bb472","617c1640-b0df-448e-8b55-a67131e77456","04c40d7b-bf0c-4d7d-a6c1-4ec93f9bb472","617c1640-b0df-448e-8b55-a67131e77456"]

[编辑二分]

好的,刚刚发现这个问题说 getMany() 可能是错误的: https ://github.com/typeorm/typeorm/issues/5851 我改用 getRawMany() ,现在我得到更多数据就足够了。 仍在使用 joinAndMap 解决解决方案,看看我能实现什么。

使用 getRawMany() 的解决方案:

const msgs = this.pmRepo.createQueryBuilder("PM")
            .leftJoinAndSelect("Users", "uSender", "uSender.id = PM.sender")
            .leftJoinAndSelect("Users", "uTarget", "uTarget.id = PM.target")
            .where(new Brackets(qb => {
                qb.where("PM.sender = :dst", { dst: user1.id })
                    .orWhere("PM.sender = :dst1", { dst1: user2.id })
            }))
            .andWhere(new Brackets(qb => {
                qb.where("PM.target = :dst", { dst: user1.id })
                    .orWhere("PM.target = :dst1", { dst1: user2.id })
            }))
            .getRawMany();

[最终编辑]

我终于有了最终的解决方案。 我不确定我在做什么,但它仍然给了我我想要的东西:

        const msgs = this.pmRepo.createQueryBuilder("PM")
            .leftJoinAndMapOne("PM.sender", User, 'users', 'users.id = PM.sender')
            .leftJoinAndMapOne("PM.target", User, 'usert', 'usert.id = PM.target')
            .where(new Brackets(qb => {
                qb.where("PM.sender = :dst", { dst: user1.id })
                    .orWhere("PM.sender = :dst1", { dst1: user2.id })
            }))
            .andWhere(new Brackets(qb => {
                qb.where("PM.target = :dst", { dst: user1.id })
                    .orWhere("PM.target = :dst1", { dst1: user2.id })
            }))
            .getMany();

输出 :

  {
        "id": 2,
        "message": "test",
        "sender": {
            "id": "617c1640-b0df-448e-8b55-a67131e77456",
            "name": "one",
            "mail": "one@lol.fr"
        },
        "target": {
            "id": "04c40d7b-bf0c-4d7d-a6c1-4ec93f9bb472",
            "name": "two",
            "mail": "two@lol.fr"
        }
    }

我只想选择名称,但现在它可以解决问题! 如果有人对此有解决方案,我仍然会采取。 谢谢 !

您应该向用户添加左连接,在 typ typeOrm 文档中有示例

我不确定我是否可以准确地告诉您您的解决方案,但是是这样的:

.leftJoinAndSelect("users", "uSender", "uSender.id = PM.sender")
.leftJoinAndSelect("users", "uTarget", "uTarget.id = PM.target")

为两个用户加入两次,之后您应该拥有所需的所有数据,只是为了格式化所需的输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM