如何在 typeorm 中使用“leftJoin”从多个表中获取结果?

Posted

技术标签:

【中文标题】如何在 typeorm 中使用“leftJoin”从多个表中获取结果?【英文标题】:How to get result from multiple tables with `leftJoin` in typeorm? 【发布时间】:2021-02-21 09:22:07 【问题描述】:

我有三张桌子:

1.视图表:

id   type    created_at    status  action_id
-----------------------------------------
1    page_1  2020-01-01    1       2

2。项目表:

id   view_id   image       action_id
-------------------------------------
1    1         thumb.png   1

3.动作表:

id    message
------------------------------------
1     this is a test
2     this an action for header view

我期待的结果是:


    "status": 1,
    "action": 
         "message": "this an action for header view"
     ,
     "items": [
         
           "id": 1,
           "description": "Comments",
           "image": "comment.png",
           "status": 1,
           "action": 
                 message: "this is test"
              
          
      ]

另外,我已经通过one-to-oneone-to-many 装饰器创建了所有具有所需关系的Entities。 那么如何在ViewRepository 中使用this.createQueryBuilder('view') 获得结果?

【问题讨论】:

【参考方案1】:

我现在可以通过这种方式获取所有必需的列:

@EntityRepository(View)
export class ViewRepository extends Repository<View> 
    async getView() 
        return await this.createQueryBuilder('view')
            .leftJoinAndSelect("view.action", "action")
            .leftJoinAndSelect("view.items", "item")
            .leftJoinAndSelect("item.action", "itemAction")
            .select([
                "view.type",
                "action.message",
                'itemAction.message',           
                'item.image',
                'item.id'
            ])
            .getOne()
    

【讨论】:

【参考方案2】:
this.viewRepository.createQueryBuilder('view')
  .leftJoin('view.items', 'item') // 'view.items' will work if you describe 'items' property in ViewEntity as a relation
  .leftJoin('view.action', 'viewAction')
  .leftJoin('item.action', 'itemAction') // the same as above, but for ItemEntity
  .select(['view.status', 'viewAction.message', 'item.id', 'item.description', 'item.image', 'item.status', 'itemAction.message']) // probably you needed to select ids from rest tables too, for correct joining 
  .where(<here is your 'where' condition>)
  .getOne() // or .getMany() if you wanna to get multiple results

更新:不确定它是否可以在存储库中工作

【讨论】:

以上是关于如何在 typeorm 中使用“leftJoin”从多个表中获取结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 typeorm 实体在 mysql 中使用现有表?

如何使用 typeorm 在嵌套 js 中存储大整数

如何使用 Jest 在 TypeORM 中存根 EntityManager 和 Connection

如何在 TypeORM 中查询数组

如何在 Nestjs 中使用 .env 文件设置 Typeorm 的配置

如何在 NestJs 中捕获 Typeorm 事务错误