Wie kann man mit Laravel und Eloquent zwischen zwei Daten abfragen?


122

Ich versuche, eine Berichtsseite zu erstellen, auf der Berichte von einem bestimmten Datum bis zu einem bestimmten Datum angezeigt werden. Hier ist mein aktueller Code:

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

Was dies in einfachem SQL tut, ist select * from table where reservation_from = $now.

Ich habe diese Abfrage hier, aber ich weiß nicht, wie ich sie in eine beredte Abfrage konvertieren soll.

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

Wie kann ich den obigen Code in eine beredte Abfrage konvertieren? Vielen Dank im Voraus.


Was ist das Datumsformat in reservation_from. Sie können die darauf basierenden Kohlenstoffwerte verwenden.
Athi Krishnan

Datumsformat ist TIMESTAMP @AthiKrishnan
Wobsoriano

4
es wäre wie Reservation::where('reservation_from', '>=', Carbon::createFromDate(1975, 5, 21);) ->where('reservation_from', '<=', Carbon::createFromDate(2015, 5, 21);)->get();
Athi Krishnan

Antworten:


245

Die whereBetweenMethode überprüft, ob der Wert einer Spalte zwischen zwei Werten liegt.

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

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

In einigen Fällen müssen Sie den Datumsbereich dynamisch hinzufügen. Basierend auf dem Kommentar von @Anovative können Sie dies tun:

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

Wenn Sie weitere Bedingungen hinzufügen möchten, können Sie diese verwenden orWhereBetween. Wenn Sie ein Datumsintervall ausschließen möchten, können Sie verwenden whereNotBetween.

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

Andere nützliche where - Klauseln: whereIn, whereNotIn, whereNull, whereNotNull, whereDate, whereMonth, whereDay, whereYear, whereTime, whereColumn, whereExists, whereRaw.

Laravel dokumentiert über Where-Klauseln.


Wie würde dies gehandhabt, wenn die $fromund $todynamische Daten wären, die zum Modell gehören? Wie in gibt es ein effective_atund expires_atFelder und ich möchte abfragen, ob das aktuelle Element innerhalb dieses Bereichs liegt. Ich habe es each()mit einem if versucht , das Carbon::now()->between( ... )jedoch alle Ergebnisse zurückgibt.
Rockin4Life33

4
EDIT für meinen obigen Kommentar: Übersehen filter(), das hat den Trick gemacht. MyModel::all()->where('column', 'value')->filter(function ($item) { if (Carbon::now->between($item->effective_at, $item->expires_at)) { return $item; } })->first();
Rockin4Life33

1
@Anovative danke für deinen nützlichen Kommentar. Ich werde meine Antwort basierend auf Ihrem Kommentar aktualisieren.
Peter Kota

es wird nur ab Datumsaufzeichnung geben.
Muhammad

1
Bei der zweiten Methode liegt ein Problem vor. Es werden alle Datensätze aus der Datenbank in den Speicher geladen und nur die Filterung durchgeführt.
Jino Antony

12

Eine weitere Option, wenn Ihr Feld datetimeanstelle von ist date( obwohl es in beiden Fällen funktioniert ):

$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
Technisch gesehen müsste es nicht $ toDate sein. 23: 59.59.999?
Stevepowell2000

@ stevepowell2000 Es hängt von Ihrer Datenbank ab. In meinem Fall speichern wir das Datum mit diesem Format 'JJJJ-MM-TT HH: MM: SS' in einem Datums- / Uhrzeit-MySQL-Feld ohne Mikrosekundengenauigkeit. Verwandte Informationen: dev.mysql.com/doc/refman/8.0/en/datetime.html
Tomloprod

Toller Punkt. Wenn es sich also um ein Datum / Uhrzeit- oder Zeitstempelfeld handelt, müssen wir möglicherweise bis 23: 59: 59.999999 gehen.
Stevepowell2000

1
Vielen Dank, dass Sie mir schon einmal bei meiner Aufgabe geholfen haben! liebe diese Antwort, Bruder! :) -habie
Habie Smart

10

Folgendes sollte funktionieren:

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

8

Wenn Sie überprüfen möchten, ob das aktuelle Datum zwischen zwei Daten in db liegt: => Hier erhält die Abfrage die Bewerbungsliste, wenn die Bewerbung des Mitarbeiters von und bis zum heutigen Datum vorhanden ist.

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

7

Versuche dies:

Da Sie basierend auf einem einzelnen Spaltenwert abrufen, können Sie Ihre Abfrage ebenfalls vereinfachen:

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

Abrufen basierend auf Bedingung: Laravel-Dokumente

Hoffe das hat geholfen.


6

Und ich habe den Modellumfang erstellt

Weitere Informationen zu Bereichen:

Code:

   /**
     * 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);
    }

Fügen Sie im Controller die Carbon Library nach oben hinzu

use Carbon\Carbon;

ODER

use Illuminate\Support\Carbon;

Um die letzten 10 Tage von jetzt an aufzunehmen

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

Um die letzten 30 Tage von jetzt an aufzunehmen

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

1
Der zweite Parameter von WhereDateBetween muss ein Array sein.
Mkey

Es ist nur ein Teil des Modells, es ist keine Builder-Methode
Manojkiran.A

Oh ja, habe das irgendwie verpasst. Mein schlechtes :)
Mkey

5

Wenn Sie angeben müssen, wann ein Datum / Uhrzeit-Feld so sein soll.

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

2
Hallo, willkommen bei Stack Overflow. Wenn Sie eine Frage beantworten, die bereits viele Antworten enthält, geben Sie bitte einen zusätzlichen Einblick, warum die von Ihnen bereitgestellte Antwort inhaltlich ist und nicht nur das wiedergibt, was bereits vom Originalplakat überprüft wurde. Dies ist besonders wichtig bei "Nur-Code" -Antworten wie der von Ihnen angegebenen.
chb

3

Ich weiß, dass dies eine alte Frage sein könnte, aber ich befand mich gerade in einer Situation, in der ich diese Funktion in einer Laravel 5.7-App implementieren musste. Unten ist, was von mir funktioniert hat.

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

Sie müssen auch Carbon verwenden

use Carbon\Carbon;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.