Een paar jaar te laat, maar je moet je EXISTS
. opgeven subquery SQL binnen de SELECT
of WHERE
instructiegedeelte van de QueryBuilder, in tegenstelling tot het gebruik van een parameter.
Bovendien sinds order
is een gereserveerd woord in MySQL, u moet identifier-aanhalingstekens gebruiken `
(back-tick) om te ontsnappen aan de tabelnaam.
Bij gebruik van de ORM; je moet een FROM
. opgeven verklaring die verwijst naar een entiteit, dus u zou uw benadering moeten veranderen.
$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
);
Ik stel echter voor om uw zoekopdracht te wijzigen van een uitsluitings-join naar een inclusie-join met NOT EXISTS
. Als u dit doet, worden de bestellingen die zijn betaald, uit uw resultatenset gefilterd. In plaats van te proberen elke bestelling bij elke betaling te voegen en de betalingen op te halen die null
teruggeven . Drastische verbetering van de prestaties van de zoekopdracht.
Voorbeeld 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
)
)