Terlambat beberapa tahun, tetapi Anda harus menentukan EXISTS
subquery SQL dalam SELECT
atau WHERE
bagian pernyataan dari QueryBuilder, bukan menggunakan parameter.
Selain itu sejak order
adalah kata yang dicadangkan di MySQL, Anda harus menggunakan tanda kutip pengenal `
(centang kembali) untuk keluar dari nama tabel.
Saat menggunakan ORM; anda harus menentukan FROM
pernyataan yang mereferensikan suatu entitas, jadi Anda perlu mengubah pendekatan Anda.
$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 yang dihasilkan
SELECT EXISTS(
SELECT 1
FROM `order` AS o
LEFT JOIN `payment` AS p
ON p.order_id = o.id
WHERE p.id IS NULL
);
Namun, saya sarankan untuk mengubah kueri Anda dari gabungan pengecualian menjadi gabungan penyertaan dengan NOT EXISTS
. Melakukannya akan memfilter pesanan yang telah dibayar, dari hasil yang Anda tetapkan. Alih-alih mencoba menggabungkan setiap pesanan pada setiap pembayaran dan mengambil pembayaran yang mengembalikan null
. Meningkatkan kinerja kueri secara dramatis.
Contoh 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
)
)