首页 > 解决方案 > 获取搜索日期的问题和输入的日期不正确,dump() 在 POSTMAN 中显示

问题描述

我在搜索$startDate和范围内的项目时遇到问题$endDate。当我输入 POSTMAN 时 localhost:8000/api/getprojectbydate?startDate=2019-02-03&endDate=2019-07-04 ,我收到了 dump_data 结果是

Expression {#296
  #value: "SELECT * FROM `projects` WHERE `startDate` BETWEEN ' + 2019-03-25 00:00:00 + ' AND ' + 2019-06-21 00:00:00 + '"
}

不知何故,查询中未正确显示日期 2019-02-03 和 2019-07-04。执行搜索功能时,这是在我的 HomeController 中

public function getProjectByDate() {

        $startDate = Carbon::parse(request('startDate'));
        $endDate = Carbon::parse(request('endDate'));

            $project = DB::RAW("SELECT * FROM `projects` WHERE `startDate` BETWEEN ' + $startDate + ' AND ' + $endDate + '");

            dd($project);

        return array($project);
    }

任何人都可以帮助解决这个问题,获取参数的值是错误的。谢谢

标签: phplaravel

解决方案


请不要以这种方式使用原始查询语句,因为这是一个安全问题,因为它会使您面临查询注入。

您以您现在的格式获取日期的原因是因为Carbon::parse()将返回一个Carbon实例,并且当它被视为一个字符串(即在您的查询中连接)时,它将Y-m-d H:i:s通过该__toString()方法转换为格式。

我建议将whereBetween查询生成器startOrDay()以及.endOfDay()Carbon

public function getProjectByDate()
{
    $startDate = Carbon::parse(request('startDate'))->startOfDay();
    $endDate = Carbon::parse(request('endDate'))->endOfDay();

    $project = DB::table('projects')
        ->whereBetween('startDate', [$startDate, $endDate])
        ->get();

    dd($project);

    return [$project];
}

如果您只希望/需要日期包含日期而不是时间,那么您可以使用该format()方法:

$startDate = Carbon::parse(request('startDate'))->format('Y-m-d');
$endDate = Carbon::parse(request('endDate'))->format('Y-m-d');

推荐阅读