Как сделать запрос между двумя датами, используя Laravel и Eloquent?
Я пытаюсь создать страницу отчета, которая показывает отчеты с определенной даты до определенной даты. Вот мой текущий код:
$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
Как я могу преобразовать код выше в красноречивый запрос? Заранее спасибо.
Ответы
Ответ 1
Метод 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
: whereIn
, whereNotIn
, whereNull
, whereNotNull
, whereDate
, whereMonth
, whereDay
, whereYear
, whereTime
, whereColumn
, whereExists
, whereRaw
.
Laravel документы о пунктах Где.
Ответ 2
Следующее должно работать:
$now = date('Y-m-d');
$reservations = Reservation::where('reservation_from', '>=', $now)
->where('reservation_from', '<=', $to)
->get();
Ответ 3
Другой вариант, если ваше поле 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();
Ответ 4
Попробуй это:
Так как вы выбираете на основе значения одного столбца, вы также можете упростить ваш запрос:
$reservations = Reservation::whereBetween('reservation_from', array($from, $to))->get();
Получить в зависимости от состояния: документы Laravel
Надеюсь, это помогло.
Ответ 5
Если вы хотите проверить, существует ли текущая дата между двумя датами в db: =>, то здесь запрос получит список приложений, если на сегодняшнюю дату существует заявка на занятость.
$list= (new LeaveApplication())
->whereDate('from','<=', $today)
->whereDate('to','>=', $today)
->get();
Ответ 6
Я знаю, что это может быть старый вопрос, но я просто оказался в ситуации, когда мне пришлось реализовать эту функцию в приложении Laravel 5.7. Ниже то, что сработало у меня.
$articles = Articles::where("created_at",">", Carbon::now()->subMonths(3))->get();
Вам также нужно будет использовать Carbon
use Carbon\Carbon;
Ответ 7
Если вам нужно знать, когда поле datetime должно быть таким.
return $this->getModel()->whereBetween('created_at', [$dateStart." 00:00:00",$dateEnd." 23:59:59"])->get();
Ответ 8
И я создал модель области
Подробнее о областях применения:
Код:
/**
* 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();