数年遅れていますが、EXISTS
を指定する必要があります SELECT
内のSQLのサブクエリ またはWHERE
パラメータを使用するのではなく、QueryBuilderのステートメント部分。
さらに、order
以降 MySQLで予約語である場合は、識別子の引用符`
を使用する必要があります (バックティック)テーブル名をエスケープします。
ORMを使用する場合。 FROM
を指定する必要があります エンティティを参照するステートメントなので、アプローチを変更する必要があります。
$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
SELECT EXISTS(
SELECT 1
FROM `order` AS o
LEFT JOIN `payment` AS p
ON p.order_id = o.id
WHERE p.id IS NULL
);
ただし、クエリを除外結合からNOT EXISTS
を使用した包含結合に変更することをお勧めします 。そうすることで、結果セットから、支払われた注文がフィルタリングされます。すべての支払いですべての注文に参加し、null
を返す支払いを取得しようとする代わりに 。クエリのパフォーマンスが大幅に向上します。
例
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
)
)