Я пытаюсь создать страницу отчета, которая показывает отчеты с определенной даты до определенной даты. Вот мой текущий код:

$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

Как преобразовать приведенный выше код в красноречивый запрос? Заранее спасибо.

191
wobsoriano 27 Окт 2015 в 09:56

8 ответов

Лучший ответ

Метод 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();

Другие полезные предложения where: whereIn, whereNotIn, whereNull, whereNotNull, whereDate, whereMonth, whereDay, {{X7 }}, whereTime, whereColumn, whereExists, whereRaw.

Laravel рассказывает о предложениях Where.

285
Peter Kota 10 Фев 2019 в 08:27

Я знаю, что это может быть старый вопрос, но я только что оказался в ситуации, когда мне пришлось реализовать эту функцию в приложении Laravel 5.7. Ниже то, что сработало у меня.

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

Вам также понадобится Углерод.

use Carbon\Carbon;
3
Excellent Lawrence 25 Апр 2019 в 13:16

И я создал объем модели

Подробнее о областях применения:

Код:

   /**
     * 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();
7
halfer 30 Июн 2019 в 13:05

Если вам нужно указать, когда поле datetime должно быть таким.

return $this->getModel()->whereBetween('created_at', [$dateStart." 00:00:00",$dateEnd." 23:59:59"])->get();
7
Zoe 25 Апр 2019 в 20:25

Попробуй это:

Поскольку вы выполняете выборку на основе значения одного столбца, вы можете аналогичным образом упростить свой запрос:

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

Получить на основе условия: laravel docs

Надеюсь, это помогло.

7
ArtisanBay 27 Окт 2015 в 09:09

Если вы хотите проверить, существует ли текущая дата между двумя датами в db: => здесь запрос получит список приложений, если приложение сотрудника от и до даты существует в сегодняшней дате.

$list=  (new LeaveApplication())
            ->whereDate('from','<=', $today)
            ->whereDate('to','>=', $today)
            ->get();
9
John 19 Ноя 2018 в 06:41

Следующее должно работать:

$now = date('Y-m-d');
$reservations = Reservation::where('reservation_from', '>=', $now)
                           ->where('reservation_from', '<=', $to)
                           ->get();
10
Pᴇʜ 27 Окт 2015 в 07:02

Другой вариант, если ваше поле - 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();
12
tomloprod 16 Янв 2020 в 07:53