एक 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')