建立一个带计数的子查询

问题描述 投票:-1回答:1

我在我的仓库里做了这个请求。

public function QB_findByGetNoTeamInFormat($idClub, $format) {
    $query = $this->createQueryBuilder('p');
    $expr = $query->expr();

    $andModule = $expr->andx();
    $andModule->add('p.id_team is not empty');
    $andModule->add($expr->neq('t.format', ':format'));

    $orModule = $expr->orx();
    $orModule->add('p.id_team is empty');
    $orModule->add($andModule);


    return $query
        ->leftJoin('p.id_team', 't')
        ->where($orModule)
        ->andWhere('p.id_club = :idClub')
        ->setParameter('idClub', $idClub)
        ->setParameter('format', $format);
}

给我这个SQL请求

SELECT 
  p0_.id AS id_0, 
  p0_.firstname AS firstname_1, 
  p0_.lastname AS lastname_2, 
  p0_.email AS email_3, 
  p0_.id_club_id AS id_club_id_4 
FROM 
  player p0_ 
  LEFT JOIN player_team p2_ ON p0_.id = p2_.player_id 
  LEFT JOIN team t1_ ON t1_.id = p2_.team_id 
WHERE 
  (
    (SELECT COUNT(*) FROM player_team p3_ WHERE p3_.player_id = p0_.id) = 0 
    OR (
      (SELECT COUNT(*) FROM player_team p3_ WHERE p3_.player_id = p0_.id) > 0 
      AND t1_.format <> ?
    )
  ) 
  AND p0_.id_club_id = ?

但这不是我想要的请求,实际上我想要这个请求。

SELECT p0_.id AS id_0, p0_.firstname AS firstname_1, p0_.lastname AS lastname_2, p0_.email AS email_3, p0_.id_club_id AS id_club_id_4, p2_.*
FROM player p0_ 
LEFT JOIN player_team p2_ ON p0_.id = p2_.player_id
WHERE (
    (SELECT COUNT(*) FROM player_team p3_ WHERE p3_.player_id = p0_.id) = 0 
    OR (
        (
            SELECT COUNT(*) 
            FROM player_team p3_ 
            LEFT JOIN team t2_ ON t2_.id = p3_.team_id 
            WHERE p3_.player_id = p0_.id
            AND t2_.format <> '6x6'
        ) < 0 
    )
) 
AND p0_.id_club_id = '1'

但我不知道如何改变我的函数来获得这个SQL请求,我试着改变了这个函数 $andModule->add('p.id_team is not empty');子查询,但我没有成功做到这一点。

doctrine-orm query-builder
1个回答
0
投票

好的。

我找到了另一种方法来完成我想要的请求。

 public function QB_findByGetNoTeamInFormat($idClub, $format) {
        $query = $this->createQueryBuilder('p');
        $expr = $query->expr();

        $q2 = $this->createQueryBuilder('p2')
            ->select('p2.id')
            ->join('p2.id_team', 't')
            ->where('t.format = :format');

        $orModule = $expr->orx();
        $orModule->add('p.id_team is empty');
        $orModule->add($expr->notIn('p.id', $q2->getDQL()));


        return $query
            ->where($orModule)
            ->andWhere('p.id_club = :idClub')
            ->setParameter('idClub', $idClub)
            ->setParameter('format', $format);
    }

© www.soinside.com 2019 - 2024. All rights reserved.