簡體   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