कुछ साल देर से, लेकिन आपको अपना EXISTS
specify निर्दिष्ट करना होगा SELECT
. के भीतर सबक्वेरी SQL या WHERE
पैरामीटर का उपयोग करने के विपरीत QueryBuilder का कथन भाग।
इसके अतिरिक्त order
. के बाद से MySQL में एक आरक्षित शब्द है, आपको पहचानकर्ता उद्धरणों का उपयोग करने की आवश्यकता होगी `
(बैक-टिक) टेबल के नाम से बचने के लिए।
ओआरएम का उपयोग करते समय; आपको एक 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
. लौटाते हैं . क्वेरी के प्रदर्शन में नाटकीय रूप से सुधार करना।
उदाहरण 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
)
)