TypeORM_子查询并且关联表

版权声明:本文为Martin原创文章,未经Martin允许不得转载。 https://blog.csdn.net/qq_36279445/article/details/88825839

  async getPostListFollowingFeed(pageIndex: number, pageSize: number, user:User) {
    const userId = user.id;
    const userRepository = getCustomRepository(UserRepository);
    const userQb = userRepository
      .createQueryBuilder('user')
      .select(`cast( jsonb_array_elements ( "user".follows ) ->> 'objectId' AS uuid ),
        jsonb_array_elements ( "user".follows ) ->> 'objectType' AS otype `)
      .where('user.id = :userId', { userId });

    const posts = await this
    .createQueryBuilder('post')
    .where((qb: any) => {
      const subQuery = qb
          .subQuery()
          .select('"tempTb".uuid')
          .leftJoin('user', 'u', 'u.id = "tempTb".uuid')
          .from(`( ${ userQb.getQuery()} )`, 'tempTb')
          .setParameters(userQb.getParameters())
          .where(`"tempTb".otype = 'user' AND u.status = :status`, { status: AccountStatus.Active })
          .getQuery();
      // tslint:disable-next-line:prefer-template
      return 'post.user_id IN ' + subQuery;
    })
    .getMany();
    return posts;
  }

生成的sql

	
SELECT
    ...
	"post"."id" AS "post_id" 
    ...
FROM
	"post" "post" 
WHERE
	"post"."user_id" IN (
	SELECT
		"tempTb".uuid 
	FROM
		(
		SELECT CAST
			( jsonb_array_elements ( "user".follows ) ->> 'objectId' AS uuid ),
			jsonb_array_elements ( "user".follows ) ->> 'objectType' AS otype 
		FROM
			"user" "user" 
		WHERE
			"user"."id" = 'bd8d86a9-247d-4f74-a8db-a935295b4520' 
		) "tempTb"
		LEFT JOIN "user" "u" ON "u"."id" = "tempTb".uuid 
	WHERE
	"tempTb".otype = 'user' 
	AND "u"."status" = 'active')

猜你喜欢

转载自blog.csdn.net/qq_36279445/article/details/88825839
今日推荐