Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

Laravel 5 OR कंडीशन के साथ BETWEEN . का उपयोग कर रहा है

एक orWhereBetween है विधि क्वेरी बिल्डर से उपलब्ध है, लेकिन यह क्वेरी बिल्डर दस्तावेज़ीकरण . हालांकि आप इसे Laravel API Documentation

नीचे दी गई व्याख्या यह मानती है कि चरों के निम्नलिखित मान हैं:

$newStart = '1';
$newEnd = '10';

दुर्भाग्य से, orWhereBetween . का उपयोग करके दूसरी शर्त के लिए आपके मामले में लागू नहीं है, क्योंकि दोनों whereBetween और orWhereBetween जांच करेगा कि कॉलम मान दो इनपुट मानों के बीच है या नहीं। यह आपकी पहली शर्त से ठीक है क्योंकि यह जांचता है कि क्या existing_start कॉलम का मान $newStart . के बीच है और $newEnd . तो यह ठीक है:

->whereBetween('existing_start', [$newStart, $newEnd])

जैसा कि इसे संकलित किया जाएगा:

WHERE `existing_start` BETWEEN '1' AND '10'

हालांकि आपकी दूसरी शर्त यह जांचना चाहती है कि $newStart . से कोई इनपुट मान है या नहीं दो कॉलम मानों के बीच है existing_start और existing_end , और कोई क्वेरी बिल्डर विधि नहीं है जो ऐसा करती है। तो यह काम नहीं करेगा:

->orWhereBetween($newStart, ['existing_start', 'existing_end'])

क्योंकि इसे संकलित किया जाएगा:

OR `1` BETWEEN 'existing_start' AND 'existing_end'

बैकटिक्स पर ध्यान दें ` लगभग 1 , उसके कारण MySQL 1 . नामक कॉलम खोजने का प्रयास करेगा और एक त्रुटि फेंको।

तो यहां सबसे अच्छा विकल्प orWhereRaw . का उपयोग करना है इस तरह की बाइंडिंग के साथ:

DB::table('tbl')
  ->whereBetween('existing_start', [$newStart, $newEnd])
  ->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
  ->get();

? $newStart . के मान से बदल दिया जाएगा जिसे ठीक से उद्धृत किया जाएगा और SQL इंजेक्शन से बचने के लिए बच जाएगा।

या निश्चित रूप से हमेशा दो समूहीकृत स्थितियां होने का विकल्प होता है जो सीमाओं की जांच करती हैं, जो आपके BETWEEN के बराबर होगी। शर्त:

DB::table('tbl')
  ->whereBetween('existing_start', [$newStart, $newEnd])
  ->orWhere(function ($query) use ($newStart) {
      $query->where('existing_start', '<=', $newStart);
      $query->where('existing_end', '>=', $newStart);
  })->get();

जो कंपाइल करेगा:

SELECT * FROM `tbl`
WHERE
  `existing_start` BETWEEN '1' AND '10' OR
  (`existing_start` <= '1' AND `existing_end` >= '1')


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Json एक संपूर्ण mysql परिणाम सेट को एन्कोड करता है

  2. MySQL में वृद्धिशील बैकअप करने का सबसे अच्छा तरीका क्या है?

  3. MySQL शीर्ष पर कॉलम नामों के साथ CSV टेक्स्ट फ़ाइलों में डंप करता है?

  4. MySQL में GCM पंजीकरण आईडी को विशिष्ट रूप से कैसे स्टोर करें

  5. एंटिटी फ्रेमवर्क के साथ मारियाडीबी का उपयोग करना