Chậm một vài năm, nhưng bạn cần chỉ định EXISTS
của mình truy vấn con SQL trong SELECT
hoặc WHERE
phần câu lệnh của QueryBuilder, trái ngược với việc sử dụng một tham số.
Ngoài ra kể từ order
là một từ dành riêng trong MySQL, bạn sẽ cần sử dụng dấu ngoặc kép `
(đánh dấu lùi) để thoát khỏi tên bảng.
Khi sử dụng ORM; bạn phải chỉ định một FROM
tuyên bố tham chiếu đến một thực thể, vì vậy bạn cần phải thay đổi cách tiếp cận của mình.
$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 kết quả
SELECT EXISTS(
SELECT 1
FROM `order` AS o
LEFT JOIN `payment` AS p
ON p.order_id = o.id
WHERE p.id IS NULL
);
Tuy nhiên, tôi khuyên bạn nên thay đổi truy vấn của mình từ một phép nối loại trừ thành một phép nối bao gồm với NOT EXISTS
. Làm như vậy sẽ lọc các đơn đặt hàng đã được thanh toán ra khỏi tập hợp kết quả của bạn. Thay vì cố gắng tham gia mọi đơn hàng trên mọi khoản thanh toán và truy xuất các khoản thanh toán trả về null
. Cải thiện đáng kể hiệu suất của truy vấn.
Ví dụ 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
)
)