Laravel ve Eloquent kullanarak iki tarih arasında nasıl sorgulama yapılır?


122

Belirli bir tarihten belirli bir tarihe kadar olan raporları gösteren bir rapor sayfası oluşturmaya çalışıyorum. İşte mevcut kodum:

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

Bunun düz SQL'de yaptığı şeydir select * from table where reservation_from = $now.

Bu sorguyu burada buldum, ancak onu güzel bir sorguya nasıl dönüştüreceğimi bilmiyorum.

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

Yukarıdaki kodu etkili sorguya nasıl dönüştürebilirim? Şimdiden teşekkür ederim.


tarih formatı nedir reservation_from. Karbon değerlerini buna göre kullanabilirsiniz.
Athi Krishnan

tarih biçimi TIMESTAMP @AthiKrishnan
wobsoriano

4
şöyle olurdu Reservation::where('reservation_from', '>=', Carbon::createFromDate(1975, 5, 21);) ->where('reservation_from', '<=', Carbon::createFromDate(2015, 5, 21);)->get();
Athi Krishnan

Yanıtlar:


247

whereBetweenBir sütunun değeri iki değer arasındaki bir yöntem doğrular olduğu.

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

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

Bazı durumlarda dinamik olarak tarih aralığı eklemeniz gerekir. @Anovative'in yorumuna dayanarak bunu yapabilirsiniz:

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

Daha fazla koşul eklemek isterseniz kullanabilirsiniz orWhereBetween. Bir tarih aralığını dışlamak istiyorsanız, kullanabilirsiniz whereNotBetween.

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

Diğer yararlı maddeleri: whereIn, whereNotIn, whereNull, whereNotNull, whereDate, whereMonth, whereDay, whereYear, whereTime, whereColumn, whereExists, whereRaw.

Laravel, Where Cümleleri hakkında belgeler.


Modele ait dinamik tarihler $fromve $tobu tarihler olsaydı bu nasıl ele alınır ? Bir effective_atve expires_atalanları olduğu gibi ve mevcut öğenin bu aralıkta olup olmadığını sorgulamak istiyorum. Kullanıyorsa bir each()ile denedim Carbon::now()->between( ... ), ancak yine de tüm sonuçları döndürüyor.
Rockin4Life33

4
Yukarıdaki yorumum için DÜZENLE: Göz ardı edildi filter(), bu hile yaptı. MyModel::all()->where('column', 'value')->filter(function ($item) { if (Carbon::now->between($item->effective_at, $item->expires_at)) { return $item; } })->first();
Rockin4Life33

1
Yararlı yorumunuz için @ Yenilikçi teşekkürler. Cevabımı yorumunuza göre güncelleyeceğim.
Peter Kota

sadece tarih kayıtlarını verecektir.
Muhammed

1
İkinci yöntemde bir sorun var. Tüm kayıtları DB'den belleğe yükleyecek ve daha sonra sadece filtrelemeyi gerçekleştirecektir.
Jino Antony

12

Alanınız datetimeyerine ise başka bir seçenek date( her iki durumda da işe yarasa da ):

$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
teknik olarak $ toDate olması gerekmezdi. "23: 59.59.999"?
stevepowell2000

@ stevepowell2000 Veritabanınıza bağlıdır, benim durumumda tarihi bu formatta 'YYYY-AA-GG SS: DD: SS' biçiminde mikrosaniye hassasiyeti olmadan bir datetime mysql alanında saklıyoruz. İlgili bilgi: dev.mysql.com/doc/refman/8.0/en/datetime.html
tomloprod

Harika nokta. Bir datetime veya zaman damgası alanı oldu Yani eğer biz may 23'e tüm yol çıkmak: 59: 59,999999 "Bir TARİH veya TIMESTAMP değer mikrosaniye (6 hane) hassas üzere up bir sondaki fraksiyonel saniye kısmını içerebilir."
stevepowell2000

1
teşekkür ederim daha önce görevimi yapmama yardım ettin! bu cevabı seviyorum kardeşim! :) -habie
Habie Smart

10

Aşağıdakiler çalışmalıdır:

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

8

Db: => içindeki iki tarih arasında geçerli tarih olup olmadığını kontrol etmek istiyorsanız, burada çalışanların başvurusu bugünkü tarihte mevcutsa, sorgu uygulama listesini alacaktır.

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

7

Bunu dene:

Tek bir sütun değerine göre getirdiğiniz için sorgunuzu da aynı şekilde basitleştirebilirsiniz:

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

Koşula göre alın: laravel belgeleri

Umarım bu yardımcı olmuştur.


6

Ve model kapsamını yarattım

Kapsamlar hakkında daha fazla bilgi:

Kod:

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

Ve denetleyicide, Karbon Kitaplığını en üste ekleyin

use Carbon\Carbon;

VEYA

use Illuminate\Support\Carbon;

Şu andan itibaren son 10 günün kaydını almak için

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

Şu andan itibaren son 30 günün kaydını almak için

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

1
WhereDateBetween ikinci parametrenin bir dizi olması gerekir.
Mkey

Bu sadece modelin bir kapsamı, Builder yöntemi değil
Manojkiran.

Oh evet, bunu bir şekilde kaçırdım. Benim hatam :)
Mkey

5

Bir datetime alanının ne zaman olması gerektiğini girmeniz gerekiyorsa.

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

2
Merhaba, Stack Overflow'a hoş geldiniz. Zaten birçok cevabı olan bir soruyu cevaplarken, lütfen verdiğiniz cevabın neden esaslı olduğuna ve orijinal gönderen tarafından halihazırda incelenmiş olanı tekrarlamadığına dair bazı ek bilgiler eklediğinizden emin olun. Bu, sağladığınız gibi "yalnızca kod" yanıtlarında özellikle önemlidir.
2019

3

Bunun eski bir soru olabileceğini biliyorum, ancak kendimi bu özelliği bir Laravel 5.7 uygulamasında uygulamak zorunda olduğum bir durumda buldum. Aşağıda benden ne işe yaradı.

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

Ayrıca Carbon kullanmanız gerekecek

use Carbon\Carbon;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.