Laravel - 按月过滤数据模型中的日期字段

7
我有一个方法可以接收一个"月份(month)"和另一个"年份(year)"的参数,你可以接收其中一个或两个参数。
如果只接收到了月份,我想要进行一次查询,在一个名为"created_at"的字段中查找该字段日期的月份
目前我使用这段代码,但是进行模糊匹配时不能正确执行。
        else if ($request->has('month')) {
        $month = $request->input('month');
        $currentTimestamp = date_create_from_format('n', $month)->getTimestamp();
        $currentDate = date('m', $currentTimestamp);
        $filters['updated_at'] = $currentDate;
        unset($filters['month']);
    }

        $cars = Car::where(function($query) use($filters) {
        foreach ($filters as $column => $value) {
            if ($column === 'updated_at') {
                $query->where($column, 'LIKE', '%'.$value.'%');
                continue;
            }
            $query->where($column, 'LIKE', '%'.$value.'%');
        }
    })->orderBy('updated_at', 'desc')->get();

created_at 是一个时间戳列吗? - Jonas Staudenmeir
3个回答

9

你可以尝试以下方法:

if ($request->has('month')) {
   $month = $request->input('month');
   Car::whereRaw('MONTH(created_at) = '.$month)->get();
}

8
你可以使用 whereMonth 方法,示例如下:
$cars = Car::whereMonth('created_at', '12')->get();

判断月份值是否存在的示例:

if ($request->has('month')) {
   $cars = Car::whereMonth('created_at', $request->input('month'))->get();
}

1
这个答案更实用,基于API和回答问题,甚至可以按月、年或日进行过滤。谢谢。 - Osify

0

你可以使用 Laravel 的查询构建器
这个想法非常简单。构建你的查询,只有在需要时才执行它。

carQuery = Car::newQuery();
if ($request->has('month') {
   carQuery->where('created_at' .. do camparison you want);
}
if ( $request->has('year') {
   // add extra query filter
}
cars = carQuery->get();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接