PHP में Query Builder से रॉ SQL निकालने के 3 कार्यशील तरीके

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

"डॉक्टर, मेरा Query Builder कुछ अजीब जनरेट कर रहा है..."

\n

परिचित स्थिति: आप Query Builder पर एक सुंदर चेन क्वेरी लिख रहे हैं, आपको विश्वास है कि सब कुछ पूरी तरह से काम कर रहा है, लेकिन आउटपुट में या तो त्रुटि है या गलत डेटा है। किसी भी PHP डेवलपर के दिमाग में सबसे पहले यही आता है: "मुझे दिखाओ कि तुम वास्तव में क्या जनरेट कर रहे हो!"।

\n

प्रश्न "How do I get the query builder to output its raw SQL query as a string?" Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है (हज़ारों व्यू और दर्जनों उत्तर)। और यह कोई संयोग नहीं है। जल्दी से शुद्ध SQL प्राप्त करने की क्षमता एक सुपरपावर है जो डिबगिंग के घंटों को बचाती है।

\n

इस लेख में, हम PHP फ्रेमवर्क (Laravel, Doctrine, CakePHP) के लिए 3 कार्यशील तरीकों पर चर्चा करेंगे, वास्तविक कोड उदाहरण दिखाएंगे और समझाएंगे कि कब किस विधि का उपयोग करना है। चलिए शुरू करते हैं!

\n\n

यह क्यों आवश्यक है? (संक्षेप में और सीधे मुद्दे पर)

\n
    \n
  • डिबगिंग — यह समझने के लिए कि क्वेरी गलत डेटा क्यों लौटा रही है।
  • \n
  • ऑप्टिमाइज़ेशन — यह देखने के लिए कि वास्तव में कौन से JOIN और WHERE निष्पादित हो रहे हैं।
  • \n
  • सीखना — शुरुआती अक्सर यह नहीं समझते कि Query Builder विधियों को SQL में कैसे बदलता है।
  • \n
  • लॉगिंग — ऑडिट या रीप्ले के लिए रॉ क्वेरी को सहेजना।
  • \n
\n

तैयार हैं? तो चलिए कोड की ओर बढ़ते हैं!

\n\n

विधि 1: Laravel Eloquent / Query Builder — क्लासिक

\n

Laravel में कई तरीके हैं, लेकिन सबसे विश्वसनीय है toSql() का उपयोग getBindings() के साथ करना। साथ में क्यों? क्योंकि toSql() प्लेसहोल्डर ? के साथ क्वेरी दिखाता है, और मानों को प्रतिस्थापित किए बिना यह बेकार है।

\n\n

सरल उदाहरण: WHERE के साथ SELECT

\n
use App\\Models\\User;\n\n$query = User::where('email', 'like', '%@gmail.com')\n             ->where('active', 1)\n             ->orderBy('created_at', 'desc');\n\n// प्लेसहोल्डर के साथ SQL प्राप्त करें\n$sql = $query->toSql();\n$bindings = $query->getBindings();\n\n// सब कुछ पढ़ने योग्य रूप में इकट्ठा करें\n$fullSql = vsprintf(str_replace('?', '%s', $sql), $bindings);\n\necho $fullSql;\n// परिणाम:\n// SELECT * FROM users WHERE email LIKE '%@gmail.com' AND active = 1 ORDER BY created_at DESC
\n

महत्वपूर्ण: vsprintf कोई रामबाण इलाज नहीं है। जटिल डेटा प्रकारों (जैसे NULL या ऐरे) के लिए Str::replaceArray() या laravel-query-builder-debug पैकेज का उपयोग करना बेहतर है।

\n\n

उन्नत विकल्प: join और whereIn के साथ

\n
$query = DB::table('orders')\n    ->join('users', 'orders.user_id', '=', 'users.id')\n    ->whereIn('orders.status', ['pending', 'processing'])\n    ->where('orders.total', '>', 100)\n    ->select('orders.*', 'users.name');\n\n$bindings = $query->getBindings();\n$sql = $query->toSql();\n\n// खूबसूरती से फॉर्मेट करें\n$fullSql = preg_replace_array('/\\?/', $bindings, $sql);\necho $fullSql;\n// SELECT orders.*, users.name FROM orders INNER JOIN users ON orders.user_id = users.id WHERE orders.status IN ('pending', 'processing') AND orders.total > 100
\n

सुझाव: preg_replace_array() का उपयोग करें — यह vsprintf से अधिक सुरक्षित है, खासकर जब डेटा में % प्रतीक हो।

\n\n

विधि 2: Doctrine DBAL — उन लोगों के लिए जो सख्ती पसंद करते हैं

\n

Doctrine Query Builder (अक्सर Symfony में उपयोग किया जाता है) थोड़ा अधिक जटिल है। यहाँ कोई तैयार toSql() नहीं है, लेकिन getSQL() और getParameters() हैं। साथ ही, पैरामीटर प्रकारों को ध्यान में रखना होगा।

\n\n

बेसिक उदाहरण

\n
use Doctrine\\DBAL\\Connection;\nuse Doctrine\\DBAL\\Query\\QueryBuilder;\n\n/** @var Connection $connection */\n$queryBuilder = $connection->createQueryBuilder();\n$queryBuilder\n    ->select('p.*', 'c.name as category_name')\n    ->from('products', 'p')\n    ->join('p', 'categories', 'c', 'p.category_id = c.id')\n    ->where('p.price > :minPrice')\n    ->andWhere('p.sto                

ब्लॉग

पुस्तक अनुशंसाएँ