Quelques années de retard, mais vous devez spécifier votre EXISTS
sous-requête SQL dans SELECT
ou WHERE
partie instruction du QueryBuilder, par opposition à l'utilisation d'un paramètre.
En plus depuis la order
est un mot réservé dans MySQL, vous devrez utiliser des guillemets d'identification `
(back-tick) pour échapper le nom de la table.
Lors de l'utilisation de l'ORM ; vous devez spécifier un FROM
déclaration qui fait référence à une entité, vous devrez donc modifier votre approche.
$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();
SQL résultant
SELECT EXISTS(
SELECT 1
FROM `order` AS o
LEFT JOIN `payment` AS p
ON p.order_id = o.id
WHERE p.id IS NULL
);
Cependant, je suggère de changer votre requête d'une jointure d'exclusion à une jointure d'inclusion avec NOT EXISTS
. Cela filtrera les commandes qui ont été payées de votre ensemble de résultats. Au lieu d'essayer de joindre chaque commande à chaque paiement et de récupérer les paiements qui renvoient null
. Améliorer considérablement les performances de la requête.
Exemple 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
)
)