Laravel और Eloquent का उपयोग करके दो तिथियों के बीच क्वेरी कैसे करें?


122

मैं एक रिपोर्ट पेज बनाने की कोशिश कर रहा हूँ जो एक विशेष तिथि से एक विशेष तारीख तक रिपोर्ट दिखाता है। यहाँ मेरा वर्तमान कोड है:

$now = date('Y-m-d');
$reservations = Reservation::where('reservation_from', $now)->get();

सादे SQL में यह क्या करता है select * from table where reservation_from = $now

मेरे पास यह क्वेरी है, लेकिन मुझे नहीं पता कि इसे कैसेक्लेव क्वेरी में बदलना है।

SELECT * FROM table WHERE reservation_from BETWEEN '$from' AND '$to

मैं ऊपर दिए गए कोड को स्पष्ट क्वेरी में कैसे बदल सकता हूं? पहले ही, आपका बहुत धन्यवाद।


में दिनांक प्रारूप क्या है reservation_from। आप उसके आधार पर कार्बन मूल्यों का उपयोग कर सकते हैं।
अथी कृष्णन

दिनांक प्रारूप TIMESTAMP @AthiKrishnan
wobsoriano

4
यह ऐसा होगा Reservation::where('reservation_from', '>=', Carbon::createFromDate(1975, 5, 21);) ->where('reservation_from', '<=', Carbon::createFromDate(2015, 5, 21);)->get();
अथी कृष्णन

जवाबों:


247

whereBetweenविधि सत्यापन एक स्तंभ के मूल्य दो मानों के बीच है।

$from = date('2018-01-01');
$to = date('2018-05-02');

Reservation::whereBetween('reservation_from', [$from, $to])->get();

कुछ मामलों में आपको तिथि सीमा को गतिशील रूप से जोड़ना होगा। @Anovative की टिप्पणी के आधार पर आप ऐसा कर सकते हैं:

Reservation::all()->filter(function($item) {
  if (Carbon::now->between($item->from, $item->to) {
    return $item;
  }
});

यदि आप अधिक शर्त जोड़ना चाहते हैं तो आप उपयोग कर सकते हैं orWhereBetween। यदि आप एक तिथि अंतराल को बाहर करना चाहते हैं तो आप उपयोग कर सकते हैं whereNotBetween

Reservation::whereBetween('reservation_from', [$from1, $to1])
  ->orWhereBetween('reservation_to', [$from2, $to2])
  ->whereNotBetween('reservation_to', [$from3, $to3])
  ->get();

अन्य उपयोगी जहां खंड: whereIn, whereNotIn, whereNull, whereNotNull, whereDate, whereMonth, whereDay, whereYear, whereTime, whereColumn, whereExists, whereRaw

जहां क्लॉस के बारे में लारवेल डॉक्स।


यदि यह मॉडल से संबंधित गतिशील तिथियां होंगी $fromऔर $toइसे कैसे संभाला जाएगा? जैसे कि एक फ़ील्ड effective_atऔर expires_atफ़ील्ड है और मैं यह देखना चाहता हूं कि वर्तमान आइटम उस सीमा के भीतर है या नहीं। मैंने कोशिश की each()कि अगर कोई Carbon::now()->between( ... )इसका उपयोग करता है , हालांकि यह अभी भी सभी परिणाम देता है।
Rockin4Life33

4
मेरे उपरोक्त टिप्पणी के लिए संपादित करें: अनदेखी filter(), कि चाल किया। MyModel::all()->where('column', 'value')->filter(function ($item) { if (Carbon::now->between($item->effective_at, $item->expires_at)) { return $item; } })->first();
Rockin4Life33

1
@ उपयोगी टिप्पणी के लिए धन्यवाद। मैं आपके जवाब को आपकी टिप्पणी के आधार पर अपडेट करूंगा।
पीटर कोटा

यह केवल दिनांक रिकॉर्ड से दिया जाएगा।
मुहम्मद

1
दूसरी विधि के साथ एक समस्या है। यह सभी रिकॉर्ड्स को DB से मेमोरी में लोड करेगा और उसके बाद ही यह फ़िल्टरिंग करेगा।
जिनो एंटनी

12

एक अन्य विकल्प यदि आपका क्षेत्र datetimeइसके बजाय है date( हालांकि यह दोनों मामलों के लिए काम करता है ):

$fromDate = "2016-10-01";
$toDate   = "2016-10-31";

$reservations = Reservation::whereRaw(
  "(reservation_from >= ? AND reservation_from <= ?)", 
  [$fromDate." 00:00:00", $toDate." 23:59:59"]
)->get();

1
तकनीकी रूप से इसे $ toDate की आवश्यकता नहीं होगी। "23: 59.59.999"?
स्टेवपोवेल2000

@ stevepowell2000 यह आपके डेटाबेस पर निर्भर करता है, मेरे मामले में हम तारीख को इस प्रारूप के साथ संग्रहित करते हैं, 'YYYY-MM-DD HH: MM: SS' एक डेटाइम मायस्कल क्षेत्र में, बिना माइक्रोसेकंड परिशुद्धता के। संबंधित जानकारी: dev.mysql.com/doc/refman/8.0/en/datetime.html
tomloprod

महान बिंदु। तो अगर यह एक datetime या टाइमस्टैम्प क्षेत्र था हम कर सकते हैं सभी 23 के लिए रास्ता बाहर जाने के लिए: 59: ५९.९,९९,९९९ "एक DATETIME या TIMESTAMP मूल्य माइक्रोसेकंड (6 अंक) परिशुद्धता अप करने के लिए में एक अनुगामी आंशिक सेकंड हिस्सा शामिल कर सकते हैं।"
stevepowell2000

1
धन्यवाद, इससे पहले कि आप अपना काम करने में मेरी मदद करें! इस उत्तर को प्यार करो भाई! :) -हाबी
हाबी स्मार्ट

10

निम्नलिखित काम करना चाहिए:

$now = date('Y-m-d');
$reservations = Reservation::where('reservation_from', '>=', $now)
                           ->where('reservation_from', '<=', $to)
                           ->get();

8

यदि आप यह जांचना चाहते हैं कि क्या db में दो तिथियों के बीच वर्तमान तिथि मौजूद है: => यहाँ क्वेरी को आवेदन सूची मिलेगी यदि रोजगार के आवेदन से और तिथि आज की तारीख में मौजूद है।

$list=  (new LeaveApplication())
            ->whereDate('from','<=', $today)
            ->whereDate('to','>=', $today)
            ->get();

7

इसे इस्तेमाल करे:

चूंकि आप एक एकल स्तंभ मान के आधार पर प्राप्त कर रहे हैं, इसलिए आप अपनी क्वेरी को सरल बना सकते हैं:

$reservations = Reservation::whereBetween('reservation_from', array($from, $to))->get();

शर्त के आधार पर लिया गया: लार्वा डॉक्स

आशा है कि इससे मदद मिली।


6

और मैंने मॉडल स्कोप बनाया है

स्कोप के बारे में अधिक जानकारी:

कोड:

   /**
     * Scope a query to only include the last n days records
     *
     * @param  \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeWhereDateBetween($query,$fieldName,$fromDate,$todate)
    {
        return $query->whereDate($fieldName,'>=',$fromDate)->whereDate($fieldName,'<=',$todate);
    }

और नियंत्रक में, शीर्ष पर कार्बन लाइब्रेरी जोड़ें

use Carbon\Carbon;

या

use Illuminate\Support\Carbon;

पिछले 10 दिनों का रिकॉर्ड अभी से हासिल करने के लिए

 $lastTenDaysRecord = ModelName::whereDateBetween('created_at',(new Carbon)->subDays(10)->toDateString(),(new Carbon)->now()->toDateString() )->get();

अब से पिछले 30 दिनों का रिकॉर्ड प्राप्त करने के लिए

 $lastTenDaysRecord = ModelName::whereDateBetween('created_at',(new Carbon)->subDays(30)->toDateString(),(new Carbon)->now()->toDateString() )->get();

1
जहां दूसरी श्रेणी के लिए एक सरणी होने की जरूरत है।
मीक

यह सिर्फ मॉडल का एक दायरा है यह बिल्डर विधि नहीं है
मनोजकिरण

अरे हाँ, किसी तरह याद किया। मेरा बुरा :)
मिक

5

यदि आप की जरूरत है जब एक datetime क्षेत्र इस तरह होना चाहिए।

return $this->getModel()->whereBetween('created_at', [$dateStart." 00:00:00",$dateEnd." 23:59:59"])->get();

2
नमस्ते, ढेर अतिप्रवाह में आपका स्वागत है। जब किसी प्रश्न का उत्तर दिया जा रहा हो, जिसमें पहले से ही कई उत्तर हों, तो कृपया कुछ अतिरिक्त जानकारी जोड़ना सुनिश्चित करें कि जो प्रतिक्रिया आप प्रदान कर रहे हैं, वह मूल क्यों है और क्या मूल पोस्टर द्वारा पहले ही वीटो लगा दिया गया है। यह विशेष रूप से "कोड-ओनली" उत्तरों में महत्वपूर्ण है जैसे कि आपने जो प्रदान किया है।
chb

3

मुझे पता है कि यह एक पुराना प्रश्न हो सकता है लेकिन मैंने अभी खुद को ऐसी स्थिति में पाया है जहाँ मुझे इस सुविधा को एक लार्वा 5.7 ऐप में लागू करना था। नीचे मेरे से काम लिया गया है।

 $articles = Articles::where("created_at",">", Carbon::now()->subMonths(3))->get();

आपको कार्बन का उपयोग करने की भी आवश्यकता होगी

use Carbon\Carbon;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.