特定の日付から特定の日付までのレポートを表示するレポートページを作成しようとしています。現在のコードは次のとおりです。
$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
上記のコードを雄弁なクエリに変換するにはどうすればよいですか?前もって感謝します。
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句:whereIn
、whereNotIn
、whereNull
、whereNotNull
、whereDate
、whereMonth
、whereDay
、whereYear
、whereTime
、whereColumn
、whereExists
、whereRaw
。
以下が機能するはずです。
$now = date('Y-m-d');
$reservations = Reservation::where('reservation_from', '>=', $now)
->where('reservation_from', '<=', $to)
->get();
フィールドが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();
これを試して:
単一の列値に基づいてフェッチしているため、同様にクエリを簡素化できます。
$reservations = Reservation::whereBetween('reservation_from', array($from, $to))->get();
条件に基づいて取得: laravel docs
これが役に立てば幸いです。
Dbの2つの日付の間に現在の日付が存在するかどうかを確認する場合:=>ここで、今日の日付に雇用者のアプリケーションが存在する場合、クエリはアプリケーションリストを取得します。
$list= (new LeaveApplication())
->whereDate('from','<=', $today)
->whereDate('to','>=', $today)
->get();
日時フィールドをこのようにする必要がある場合。
return $this->getModel()->whereBetween('created_at', [$dateStart." 00:00:00",$dateEnd." 23:59:59"])->get();
申し訳ありませんが、私は数日前に同じ状況になりました
そして、私はモデルスコープを作成しました
スコープの詳細
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();
これは古い質問かもしれませんが、この機能をLaravel 5.7アプリに実装しなければならない状況に陥りました。以下は私から働いたものです。
$articles = Articles::where("created_at",">", Carbon::now()->subMonths(3))->get();
Carbonも使用する必要があります
use Carbon\Carbon;