LaravelとEloquentを使用して2つの日付の間でクエリを実行する方法は?


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。これに基づいてCarbon値を使用できます。
Athi Krishnan

日付形式はTIMESTAMP @AthiKrishnanです
wobsoriano

4
それはReservation::where('reservation_from', '>=', Carbon::createFromDate(1975, 5, 21);) ->where('reservation_from', '<=', Carbon::createFromDate(2015, 5, 21);)->get()
Athi Krishnan

回答:


245

このwhereBetweenメソッドは、列の値が2つの値の間にあることを確認します。

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

他の有用な句:whereInwhereNotInwhereNullwhereNotNullwhereDatewhereMonthwhereDaywhereYearwhereTimewhereColumnwhereExistswhereRaw

Where句に関するLaravelのドキュメント。


どの場合、これが処理される$fromと、$toモデルに属しているダイナミックな日数でしょうか?のようにeffective_atexpires_atフィールドがあり、現在のアイテムがその範囲内にあるかどうかを確認するためにクエリを実行したいと思います。each()ifを使用してif を試しました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
2番目の方法に問題があります。すべてのレコードを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 2018

@ stevepowell2000これはデータベースに依存しますが、私の場合、日付のmysqlフィールドにこの形式 'YYYY-MM-DD HH:MM:SS'でマイクロ秒の精度なしで日付を格納します。関連情報:dev.mysql.com/doc/refman/8.0/en/datetime.html
tomloprod

素晴らしい点。そのため、それが日時フィールドまたはタイムスタンプフィールドである場合、23:59:59.999999に至るまで進むことができます。
stevepowell2000 2018

1
以前に私の仕事を手伝ってくれてありがとう!この回答が大好きです。:) -habie
Habie Smart

10

以下はうまくいくはずです:

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

8

現在の日付がdbの2つの日付の間に存在するかどうかを確認する場合:=>ここで、雇用者のアプリケーションの開始日と終了日が今日の日付に存在する場合、クエリはアプリケーションリストを取得します。

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

7

これを試して:

単一の列の値に基づいてフェッチしているため、同様にクエリを簡略化できます。

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

条件に基づいて取得:laravel docs

これがお役に立てば幸いです。


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の2番目のパラメーターは配列である必要があります。
Mkey

これはビルダーメソッドではなくモデルのスコープにすぎません
Manojkiran.A

ああ、どういうわけかそれを逃した。私の悪い:)
Mkey

5

日時フィールドが次のようになっている必要がある場合。

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

2
こんにちは、Stack Overflowへようこそ。すでに多くの回答が含まれている質問に回答する場合は、提供している回答が実質的であり、元の投稿者がすでに精査した内容を単にエコーするのではなく、なぜ追加の洞察を追加してください。これは、提供したような「コードのみ」の回答では特に重要です。
chb

3

これは古い質問かもしれませんが、Laravel 5.7アプリにこの機能を実装する必要がある状況に気づきました。以下は私から働いたものです。

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

また、カーボンを使用する必要があります

use Carbon\Carbon;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.