【问题标题】:Wrong records when filtering date过滤日期时记录错误
【发布时间】:2020-02-18 11:06:13
【问题描述】:

当我按日期过滤相关模型时,我遇到了奇怪的问题, 考虑这段代码:

function applyDepositOnRangeFilter($query, $request)
{
    if ($request->has('deposit_at_from')) {
        $query->whereHas('deposits', function ($query) use ($request) {
            $query->whereDate('created_at', '>=', $request->input('deposit_at_from'));
        });
    }


    if ($request->has('deposit_at_to')) {
        $query->whereHas('deposits', function ($query) use ($request) {
            $query->whereDate('created_at', '<=', $request->input('deposit_at_to'));
        });
    }
}

如果我过滤了昨天的日期 17/02/20;它也返回今天日期为 18/02/20 的结果 如果我过滤 16/02/20 它也返回 17 和 18, 它只发生在所有相关的模型过滤中

【问题讨论】:

  • 你传递的日期格式是什么?
  • 删除大于号仅使用 =
  • 你的数据库字段(created_at)$request-&gt;input('deposit_at_from'))格式应该一样
  • 格式为 deposit_at_to=2020-02-17

标签: php laravel eloquent eloquent-relationship


【解决方案1】:

去掉大于号和小于号,以便得到具体的日期结果

function applyDepositOnRangeFilter($query, $request)
{
if ($request->has('deposit_at_from')) {
    $query->whereHas('deposits', function ($query) use ($request) {
        $query->whereDate('created_at', '=', $request->input('deposit_at_from'));
    });
}


if ($request->has('deposit_at_to')) {
    $query->whereHas('deposits', function ($query) use ($request) {
        $query->whereDate('created_at', '=', $request->input('deposit_at_to'));
    });
 }
}

【讨论】:

    【解决方案2】:

    您正在搜索范围,因此获得多个日期是合乎逻辑的。同样在输入时,您需要将两个日期都设置为限制下限和上限。在您的设置中,您需要同时发送 16/02/20 和 17/02/20 以接收 16/02/20 的记录。

    如果您需要获取特定范围,请检查这两个值是否可用。

    if ($request->has('deposit_at_from') && $request->has('deposit_at_to') {
         $query->whereHas('deposits', function ($query) use ($request) {
                $query->whereDate('created_at', '>=', $request->input('deposit_at_from'));
         $query->whereHas('deposits', function ($query) use ($request) {
                $query->whereDate('created_at', '<=', $request->input('deposit_at_to'));
    
    } 
    

    或者只使用一个字段进行日期过滤,您想要一个日期结果并进行原始过滤:

    $query->where(DB::raw("DATE(created_at) = '".date('Y-m-d', $request->input('deposit_date')."'"));
    
    

    【讨论】:

      【解决方案3】:

      对不起,伙计们,但我想通了,这对我来说是获取范围的方法:

        $query->whereHas('deposits', function ($query) use ($request) {
                  $query->whereDate('created_at', '>=', $request->input('deposit_at_from')) 
                  ->whereDate('created_at', '<=', $request->input('deposit_at_to'));
        })
      

      如果你想知道 laravel 版本是 5.6,

      谢谢大家:-))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-17
        • 1970-01-01
        • 2013-06-23
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        • 1970-01-01
        • 2021-09-19
        相关资源
        最近更新 更多