Laravel Eloquent में जटिल WHERE क्वेरी बनाने के 4 तरीके (उदाहरण सहित)
\n\nकल्पना कीजिए: आप Laravel में एक ऑनलाइन स्टोर बना रहे हैं। आपको वे सभी उत्पाद खोजने हैं जिनकी कीमत 1000 से 5000 रुपये के बीच हो, स्टॉक में उपलब्ध हों, "सेल" श्रेणी के न हों, और 1 जनवरी 2024 के बाद बनाए गए हों। यह सब एक ही क्वेरी में कैसे करें, बिना परफॉरमेंस खराब किए?
\n\nयह सवाल Stack Overflow पर सबसे लोकप्रिय में से एक है (हज़ारों व्यूज़!)। और यह सही भी है: Laravel Eloquent में जटिल WHERE शर्तें बनाने की क्षमता एक नौसिखिए को एक प्रोडक्शन-रेडी डेवलपर से अलग करती है।
\n\nइस लेख में, मैं आपको 4 सिद्ध तरीके दिखाऊंगा जिनसे आप कई WHERE शर्तें बना सकते हैं। आप सीखेंगे कि कब arrays का उपयोग करना है और कब closures का, शर्तों को कैसे समूहित करना है, और SQL इंजेक्शन से कैसे बचना है। चलिए शुरू करते हैं!
\n\n\n\n
1. बुनियादी तरीका: शर्तों की array (सरल AND के लिए)
\n\nसबसे आसान मामला — जब सभी शर्तें AND से जुड़ी हों। Laravel आपको where() में एक सामान्य array पास करने देता है:
<?php\n\n// हम 2024 में बने रूस के सक्रिय उपयोगकर्ता खोजना चाहते हैं\n$users = User::where([\n ['status', '=', 'active'],\n ['country', '=', 'Russia'],\n ['created_at', '>=', '2024-01-01'],\n])->get();\n\n// SQL: SELECT * FROM users WHERE status = 'active' AND country = 'Russia' AND created_at >= '2024-01-01'\n\nकब उपयोग करें: जब आपके पास 2-5 सरल शर्तें हों जिनमें = या > ऑपरेटर हो। कोड पढ़ने में आसान होता है, लेकिन लचीला नहीं है।
कमी: अगर आपको AND और OR को मिलाना है, तो array काम नहीं करेगा।
2. where() मेथड की चेन (डायनामिक शर्तों के लिए)
\n\nयह डेवलपर्स के बीच सबसे लोकप्रिय तरीका है। आप बस where() को एक के बाद एक कई बार कॉल करते हैं:
<?php\n\n$products = Product::where('price', '>', 1000)\n ->where('price', '<', 5000)\n ->where('in_stock', true)\n ->where('category_id', '!=', 5)\n ->get();\n\n// SQL: ... WHERE price > 1000 AND price < 5000 AND in_stock = 1 AND category_id <> 5\n\nट्रिक: आप इसे अन्य शर्तों के साथ जोड़ सकते हैं:
\n\n<?php\n\n// चेन के अंदर "OR" शर्त\n$orders = Order::where('status', 'paid')\n ->orWhere('status', 'shipped')\n ->where('total', '>', 100) // ध्यान दें: यह शर्त पिछले orWhere पर लागू होती है!\n ->get();\n\n// SQL: ... WHERE status = 'paid' OR (status = 'shipped' AND total > 100)\n\n⚠️ महत्वपूर्ण! पिछले उदाहरण में where total > 100 केवल status = 'shipped' पर लागू होता है। अगर आप चाहते हैं कि दोनों स्टेटस के लिए total > 100 हो — तो अगला पॉइंट पढ़ें।
3. Closures के माध्यम से शर्तों का समूहीकरण (AND + OR एक साथ)
\n\nयहाँ हम सबसे शक्तिशाली टूल पर आते हैं। जब आपको कोष्ठकों में शर्तों का एक समूह बनाना हो — तो where() के अंदर closure का उपयोग करें:
<?php\n\n// कार्य: "paid" या "shipped" स्टेटस वाले ऑर्डर खोजें,\n// लेकिन दोनों मामलों में total > 100 होना चाहिए\n$orders = Order::where(function($query) {\n $query->where('status', 'paid')\n ->orWhere('status', 'shipped');\n })\n ->where('total', '>', 100)\n ->get();\n\n// SQL: ... WHERE (status = 'paid' OR status = 'shipped') AND total > 100\n\nअब शर्तें सही ढंग से समूहित हैं! आप closures को एक-दूसरे के अंदर जितनी बार चाहें नेस्ट कर सकते हैं:
\n\n<?php\n\n// एनालिटिक्स के लिए जटिल फ़िल्टर\n$data = Sale::where('date', '>=', '2024-01-01')\n ->where(function($q) {\n $q->where('amount', '>', 10000)\n ->orWhere('is_vip', true);\n })\n ->where(function($q) {\n $q-&>