जब भी क्वेरी समस्याओं का सामना करना पड़े, तो जांचें कि वास्तव में कौन से प्रश्न उत्पन्न हो रहे हैं (उदाहरण के लिए डीबगकिट ) जब तक कि एक अभिव्यक्ति वस्तु न हो, एक शर्त के दाहिने हाथ हमेशा एक पैरामीटर के रूप में बंधे रहेंगे, यानी आप एक स्ट्रिंग अक्षर के खिलाफ तुलना कर रहे हैं:
Pupils.school_id = 'Schools.id'
आम तौर पर उचित ऑटो उद्धरण संगतता के लिए, कॉलम नाम पहचानकर्ता अभिव्यक्ति होना चाहिए। जबकि बाएं हाथ की ओर स्वचालित रूप से ठीक से संभाला जाएगा, दाहिने हाथ को मैन्युअल रूप से संभालने की आवश्यकता होगी।
अपने विशिष्ट मामले में आप आसानी से उपयोग कर सकते हैं QueryExpression::equalFields()
, जो कि ठीक वही है जो आप करने का प्रयास कर रहे हैं, फ़ील्ड/कॉलम की तुलना करना:
->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
return $exp->equalFields('Pupils.school_id', 'Schools.id');
})
पहचानकर्ता भावों को केवल तत्काल करके मैन्युअल रूप से बनाना भी संभव है:
->where([
'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])
या केकेपीएचपी 3.6 के रूप में Query::identifier()
. के माध्यम से विधि:
->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
और अंत में आप हमेशा एक स्ट्रिंग मान भी पास कर सकते हैं, जो मूल रूप से कच्चे एसक्यूएल के रूप में क्वेरी में डाला जाता है, हालांकि उस स्थिति में पहचानकर्ता स्वचालित पहचानकर्ता उद्धरण के अधीन नहीं होंगे:
->where([
'Pupils.school_id = Schools.id'
])
यह भी देखें
- कुकबुक> डेटाबेस एक्सेस और ORM> क्वेरी निर्माता> उन्नत शर्तें
- API> \Kake\ डेटाबेस\अभिव्यक्ति\QueryExpression::equalFields()
- API> \Kake\Database\ एक्सप्रेशन\आइडेंटिफ़ायरएक्सप्रेशन