Et par år forsinket, men du skal angive din EXISTS
underforespørgsel SQL i SELECT
eller WHERE
sætningsdelen af QueryBuilder, i modsætning til at bruge en parameter.
Derudover siden order
er et reserveret ord i MySQL, skal du bruge identifikationsanførselstegn `
(Tilbagekryds) for at undslippe tabelnavnet.
Når du bruger ORM; du skal angive en FROM
erklæring, der refererer til en enhed, så du bliver nødt til at ændre din tilgang.
$connection = $this->em->getConnection();
$expr = $connection->getExpressionBuilder();
$qbSub = $connection->createQueryBuilder()
->select(['1'])
->from('`order`', 'o')
->leftJoin('o', '`payment`', 'p', $exor->eq('p.order_id', 'o.id'))
->where($expr->isNull('p.id'));
/**
* @return string "1" if a record exists, "0" otherwise
*/
$connection->createQueryBuilder()
->select('EXISTS(' . $qbSub->getSQL() . ')')
->execute()
->fetchColumn();
$qb
->setParameter('name', $value)
->execute();
Resulterende SQL
SELECT EXISTS(
SELECT 1
FROM `order` AS o
LEFT JOIN `payment` AS p
ON p.order_id = o.id
WHERE p.id IS NULL
);
Jeg foreslår dog, at du ændrer din forespørgsel fra en ekskluderings-join til en inclusion join med NOT EXISTS
. Hvis du gør det, vil ordrer, der er blevet betalt, filtreres ud af dit resultatsæt. I stedet for at forsøge at slutte sig til hver ordre på hver betaling og hente de betalinger, der returnerer null
. Dramatisk forbedring af forespørgslens ydeevne.
Eksempel db-fiddle
SELECT EXISTS (
SELECT 1
FROM `order` AS o2
WHERE NOT EXISTS(
SELECT NULL
FROM `order` AS o
INNER JOIN `payment` AS p
ON p.order_id = o.id
WHERE o2.id = o.id
)
)