• typeorm查询两个没有关联关系的实体


    Post实体

    @Entity({ name: 'post', schema: 'public' })
    export class Post {
        @PrimaryGeneratedColumn()
        id: number;
    
        @Column({ nullable: false })
        title: string;
    
        @Column({
            type: 'text', nullable: false
        })
        content: string;
    
    }

    PostExtend 实体

    在post实体中设置postId存放post主键id

     1 @Entity({ name: 'postExtend', schema: 'public' })
     2 export class PostExtend {
     3     @PrimaryGeneratedColumn()
     4     id: number;
     5 
     6     @Column({ nullable: false })
     7     postId: number;
     8 
     9     @Column({ nullable: true })
    10     likeCount: number;
    11 
    12     @Column({ nullable: true })
    13     readCount: number;
    14 
    15     @Column({ nullable: true })
    16     forwardCount: number;
    17 
    18 }

     Post和PostExtend中没有设置关联关系,所以我们并不能在find option中关联两个实体进行连表查询。

    但是可以用queryBuilder 

    1 const posts = await getConnection()
    2             .createQueryBuilder(Post, 'post')
    3             .leftJoinAndSelect(PostExtend, 'postExtend', 'post.id=postExtend.postId')
    4             .getManyAndCount()
    5         return posts;

    查询结果

    [
        [
            {
                "id": 1,
                "title": "北京申奥成功",
                "content": "2003年奥林匹克运动会将在北京举行,北京欢迎你!"
            }
        ],
        1
    ]

     上面的查询结果中并没有PostExtend的数据,这是因为不能确定两个实体之间的关联关系,所以无法确定查询结果的显示形式。

    当然,也可以通过 getRawMany() 方法获取原生字段来获取PostExtend的信息,但是这样的查询结果显示并不友好。

    1 const posts = await getConnection()
    2             .createQueryBuilder(Post, 'post')
    3             .leftJoinAndSelect(PostExtend, 'postExtend', 'post.id=postExtend.postId')
    4             .getRawMany()
    5         return posts;

    原生的查询结果:

     1 [
     2     {
     3         "post_id": 1,
     4         "post_title": "北京申奥成功",
     5         "post_content": "2003年奥林匹克运动会将在北京举行,北京欢迎你!",
     6         "postExtend_id": 1,
     7         "postExtend_postId": 1,
     8         "postExtend_likeCount": 999,
     9         "postExtend_readCount": 10000,
    10         "postExtend_forwardCount": 666
    11     }
    12 ]

     如果想要将原生字段映射到属性,可以使用 leftJoinAndMapOne() ,如果时一对多还可以使用 leftJoinAndMapMany() 

    1 @Get('all')
    2     public async getPosts(@Query() query: any) {
    3         const posts = await getConnection()
    4             .createQueryBuilder(Post, 'post')
    5             .leftJoinAndMapOne('post.postExtend',PostExtend, 'postExtend', 'post.id=postExtend.postId')
    6             .getManyAndCount()
    7         return posts;
    8     }

    上面代码的查询结果如下:

     1 [
     2     [
     3         {
     4             "id": 1,
     5             "title": "北京申奥成功",
     6             "content": "2003年奥林匹克运动会将在北京举行,北京欢迎你!",
     7             "postExtend": {
     8                 "id": 1,
     9                 "postId": 1,
    10                 "likeCount": 999,
    11                 "readCount": 10000,
    12                 "forwardCount": 666
    13             }
    14         }
    15     ],
    16     1
    17 ]

     postExtend的数据被映射到post.postExtend,这样的结果清晰明了。

  • 相关阅读:
    Atitit 图像金字塔原理与概率 attilax的理解总结qb23
    Atiti  attilax主要成果与解决方案与案例rsm版 v4
    Atitit 常用比较复杂的图像滤镜 attilax大总结
    Atitit. Api 设计 原则 ---归一化
    Atitit 面向对象弊端与问题 坏处 缺点
    Atitit  记录方法调用参数上下文arguments
    Atitit 作用域的理解attilax总结
    Atitit usrQBM1603短信验证码规范
    atitit 短信验证码的源码实现  .docx
    Atitit 图片 验证码生成attilax总结
  • 原文地址:https://www.cnblogs.com/zzk96/p/11397223.html
Copyright © 2020-2023  润新知