在whereBetween查询中将laravel中的created_at列转换为y-m-d格式

时间:2018-08-10 07:50:01

标签: php laravel laravel-5

这是我的控制器

public function index(){
    $products = Order::whereHas('user', function ($query) {
    if(request()->has('d') && request()->get('d')){
        $arr = [
           'start' => Carbon::parse(substr(request()->get('d'), 4, 11))->format('Y-m-d'),
           'end' =>  Carbon::parse(substr(request()->get('d'), 64, -44))->format('Y-m-d')
                ];
            $builder = $query->whereBetween('created_at', [$arr['start'],$arr['end']]);
           }
        });
   return OrdersResource::collection($orders->latest()->paginate(5));
    }

我的数组$arr看起来像这样

array:2 [
  "start" => "2018-08-07"
  "end" => "2018-08-09"
]

如何将laravel中的created_at (which is a datetime)列更改为仅年月日格式

我需要将created_at转换为该格式,以便执行laravel的whereBetween查询,因为它没有提供确切的结果

2 个答案:

答案 0 :(得分:1)

我建议您将created_atstart更新为第一个日期的开始和最后一个日期的结束,而不是更改end列的格式。 Carbon对象应该传递给whereBetween方法,而不是它们的字符串表示形式。

$arr = [
   'start' => Carbon::parse(substr(request()->get('d'), 4, 11))->startOfDay(),
   'end' =>  Carbon::parse(substr(request()->get('d'), 64, -44))->endOfDay()
];

// Both `start` and `end` are Carbon objects
$builder = $query->whereBetween('created_at', [$arr['start'],$arr['end']]);

答案 1 :(得分:0)

您可以使用mysql DATE()函数

$builder = $query->whereBetween(DB::raw('DATE(created_at)'), [$arr['start'],$arr['end']]);

如果要更改日期格式,请DATE_FORMAT(created_at, '%Y-%m-%d')

不要忘记导入DB

use DB;