Ein paar Jahre zu spät, aber Sie müssen Ihre EXISTS
angeben Unterabfrage SQL innerhalb von SELECT
oder WHERE
-Anweisungsteil des QueryBuilder, im Gegensatz zur Verwendung eines Parameters.
Zusätzlich seit order
ein reserviertes Wort in MySQL ist, müssen Sie Bezeichner-Anführungszeichen `
verwenden (Back-Tick), um den Tabellennamen zu maskieren.
Bei Verwendung des ORM; Sie müssen einen FROM
angeben -Anweisung, die auf eine Entität verweist, sodass Sie Ihren Ansatz ändern müssten.
$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();
Ergebnis-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
);
Ich schlage jedoch vor, Ihre Abfrage von einem Ausschluss-Join in einen Inklusions-Join mit NOT EXISTS
zu ändern . Dadurch werden bezahlte Bestellungen aus Ihrer Ergebnisliste herausgefiltert. Anstatt zu versuchen, jede Bestellung bei jeder Zahlung zusammenzuführen und die Zahlungen abzurufen, die null
zurückgeben . Drastische Verbesserung der Leistung der Abfrage.
Beispiel 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
)
)