Con qualche anno di ritardo, ma devi specificare il tuo EXISTS
sottoquery SQL all'interno di SELECT
o WHERE
parte dell'istruzione di QueryBuilder, invece di utilizzare un parametro.
Inoltre da order
è una parola riservata in MySQL, dovrai usare le virgolette di identificazione `
(segno di spunta indietro) per sfuggire al nome della tabella.
Quando si utilizza l'ORM; devi specificare un FROM
dichiarazione che fa riferimento a un'entità, quindi dovresti cambiare il tuo approccio.
$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 risultante
SELECT EXISTS(
SELECT 1
FROM `order` AS o
LEFT JOIN `payment` AS p
ON p.order_id = o.id
WHERE p.id IS NULL
);
Tuttavia, ti suggerisco di modificare la tua query da un join di esclusione a un join di inclusione con NOT EXISTS
. In questo modo filtrerai gli ordini che sono stati pagati, fuori dal tuo set di risultati. Invece di tentare di unire ogni ordine su ogni pagamento e recuperare i pagamenti che restituiscono null
. Migliora notevolmente le prestazioni della query.
Esempio 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
)
)