[英]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.