web-dev-qa-db-ja.com

LaravelとEloquent ORMを使用して2つの日付間のクエリを実行するにはどうすればよいですか?

特定の日付から特定の日付までのレポートを表示するレポートページを作成しようとしています。現在のコードは次のとおりです。

$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

上記のコードを雄弁なクエリに変換するにはどうすればよいですか?前もって感謝します。

59
wobsoriano

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

その他の便利なwhere句:whereInwhereNotInwhereNullwhereNotNullwhereDatewhereMonthwhereDaywhereYearwhereTimewhereColumnwhereExistswhereRaw

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

129
Peter Kota

以下が機能するはずです。

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

フィールドがdatetimeではなくdateである場合の別のオプション(ただし、両方の場合に機能します):

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

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

これを試して:

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

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

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

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

6
ArtisanBay

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

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

日時フィールドをこのようにする必要がある場合。

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

申し訳ありませんが、私は数日前に同じ状況になりました

そして、私はモデルスコープを作成しました

スコープの詳細

https://laravel.com/docs/5.8/eloquent#query-scopes

https://medium.com/@janaksan_/using-scope-with-laravel-7c80dd6a2c3d

/**
     * 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\Carbonを使用します。

または

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
Manojkiran.A

これは古い質問かもしれませんが、この機能をLaravel 5.7アプリに実装しなければならない状況に陥りました。以下は私から働いたものです。

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

Carbonも使用する必要があります

use Carbon\Carbon;
1