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? 이를 기반으로 탄소 값을 사용할 수 있습니다.
Athi Krishnan 2015

날짜 형식은 TIMESTAMP @AthiKrishnan입니다
wobsoriano

4
다음과 같습니다. Reservation::where('reservation_from', '>=', Carbon::createFromDate(1975, 5, 21);) ->where('reservation_from', '<=', Carbon::createFromDate(2015, 5, 21);)->get();
Athi Krishnan 2015

답변:


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.

Where 절에 대한 Laravel 문서.


경우 이것은 어떻게 처리 할 것입니다 $from$to모델에 속하는 동적 날짜 있을까? 에서와 같은 존재 effective_atexpires_at필드와 나는 현재 항목이 그 범위 내에 있는지 확인하기 위해 쿼리합니다. each()사용하는 경우 시도했지만 Carbon::now()->between( ... )여전히 모든 결과를 반환합니다.
Rockin4Life33 2019

4
내 위의 의견에 대한 편집 : 간과 filter(), 그 트릭을했습니다. MyModel::all()->where('column', 'value')->filter(function ($item) { if (Carbon::now->between($item->effective_at, $item->expires_at)) { return $item; } })->first();
Rockin4Life33 2019

1
@Anovative 귀하의 유용한 의견에 감사드립니다. 귀하의 의견에 따라 답변을 업데이트하겠습니다.
Peter Kota

그것은 날짜 기록에서만 줄 것입니다.
Muhammad

1
두 번째 방법에 문제가 있습니다. DB에서 메모리로 모든 레코드를로드 한 다음 필터링 만 수행합니다.
Jino Antony

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"?
stevepowell2000

@ stevepowell2000 데이터베이스에 따라 다르며, 제 경우에는 마이크로 초 정밀도없이 datetime mysql 필드에 'YYYY-MM-DD HH : MM : SS'형식으로 날짜를 저장합니다. 관련 정보 : dev.mysql.com/doc/refman/8.0/en/datetime.html
tomloprod

좋은 지적입니다. 그것은 날짜 또는 시간 소인 필드했다 그렇다면 우리는 할 수있다 (23)에 모든 방법을 외출 : 59 : 59.999999 "A DATETIME 또는 TIMESTAMP 값이 마이크로 초 (6 자리)의 정밀도까지의 후행 소수 초 부분을 포함 할 수 있습니다."
stevepowell2000

1
전에 내 임무를 수행하도록 도와 주셔서 감사합니다! 이 대답을 사랑해! :) -habie
Habie Smart

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();

조건에 따라 검색 : laravel 문서

이것이 도움이 되었기를 바랍니다.


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

컨트롤러에서 상단에 Carbon Library를 추가합니다.

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
WhereDateBetween 두 번째 매개 변수는 배열이어야합니다.
Mkey

빌더 방법이 아닌 모델의 범위
일뿐입니다

오 그래, 어떻게 든 놓 쳤어. My bad :)
Mkey

5

datetime 필드가 다음과 같아야 할 때 필요하다면.

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

2
안녕하세요, Stack Overflow에 오신 것을 환영합니다. 이미 많은 답변이있는 질문에 답변 할 때 제공하는 답변이 왜 실질적이고 원본 포스터가 이미 심사 한 내용을 반영하지 않는지에 대한 추가 정보를 추가해야합니다. 이것은 귀하가 제공 한 것과 같은 "코드 전용"답변에서 특히 중요합니다.
chb apr

3

나는 이것이 오래된 질문 일 수 있다는 것을 알고 있지만 Laravel 5.7 앱에서이 기능을 구현해야하는 상황에 처했습니다. 아래는 저에게서 일한 것입니다.

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

Carbon을 사용해야합니다.

use Carbon\Carbon;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.