我在我的仓库里做了这个请求。
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');
子查询,但我没有成功做到这一点。
好的。
我找到了另一种方法来完成我想要的请求。
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);
}