如何使用Laravel和Eloquent ORM在两个日期之间进行查询?

时间:2015-10-27 06:56:04

标签: php laravel laravel-5 orm

我正在尝试创建一个报告页面,显示从特定日期到特定日期的报告。这是我目前的代码:

$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

如何将上面的代码转换为雄辩的查询?提前谢谢。

8 个答案:

答案 0 :(得分:128)

whereBetween方法验证列的值介于两者之间 两个值。

$from = date('2018-01-01');
$to = date('2018-05-02');

Reservation::whereBetween('reservation_from', [$from, $to])->get();

在某些情况下,您需要动态添加日期范围。根据{{​​3}}的评论,您可以执行此操作:

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

@Anovative

答案 1 :(得分:9)

以下内容应该有效:

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

答案 2 :(得分:7)

如果您的字段为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();

答案 3 :(得分:6)

试试这个:

由于您基于单个列值进行提取,因此您可以同样简化查询:

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

根据条件检索:laravel docs

希望这会有所帮助。

答案 4 :(得分:5)

如果要检查db中两个日期之间是否存在当前日期: =>如果在今天的日期中存在从日期到现在的从业人员申请,则查询将在此获取申请列表。

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

答案 5 :(得分:1)

对不起,我迟到了几天之前也遇到了同样的情况

我已经创建了模型作用域

有关范围的更多信息

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 \ Carbon;

OR

  

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

答案 6 :(得分:1)

我知道这可能是一个老问题,但是我发现自己处于必须在Laravel 5.7应用程序中实现此功能的情况。以下是我的工作方式。

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

您还需要使用Carbon

use Carbon\Carbon;

答案 7 :(得分:1)

如果您需要在datetime字段中输入这样的内容。

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