Unos años tarde, pero debes especificar tu EXISTS
subconsulta SQL dentro de SELECT
o WHERE
parte de la declaración de QueryBuilder, en lugar de usar un parámetro.
Además desde order
es una palabra reservada en MySQL, necesitará usar comillas de identificador `
(marcha atrás) para escapar del nombre de la tabla.
Al usar el ORM; debe especificar un FROM
declaración que hace referencia a una entidad, por lo que tendría que cambiar su enfoque.
$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 resultante
SELECT EXISTS(
SELECT 1
FROM `order` AS o
LEFT JOIN `payment` AS p
ON p.order_id = o.id
WHERE p.id IS NULL
);
Sin embargo, sugiero cambiar su consulta de una combinación de exclusión a una combinación de inclusión con NOT EXISTS
. Al hacerlo, se filtrarán los pedidos que se hayan pagado de su conjunto de resultados. En lugar de intentar unir cada pedido en cada pago y recuperar los pagos que devuelven null
. Mejorando drásticamente el rendimiento de la consulta.
Ejemplo 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
)
)