首页 > 解决方案 > 通过 eloquent 从 laravel 中 db 中的两个日期列中获取记录

问题描述

我有一个叶子表user_leaves,其中存储了用户使用的叶子,表具有这种结构。

id, leave_type_id, from_date, to_date, status, created_at, updated_at.

leave_type_id基本上是我系统的叶子类型的外键。

我想获取用户在两个日期范围内拍摄的所有叶子,例如start_dateand end_date(例如从2020-08-01to的所有叶子2020-08-31

我想要像这样的数字记录,

 {
   "user_id" : 1,
   "leaves" : 
    {
    "medical_leave" : 2,
    "earned_leave" : 5,
    "sick_leave" : 3
    }
  }

我使用了代码

                   $UserLeaves = UserLeave::whereDate('date_from', '>=', $start_date)
                            ->whereDate('date_from', '<=', $end_date)
                            ->get();

问题是,如果我选择from_date查询我的结果,然后循环$UserLeaves获取每个 leave_type 的 from_date 和 to_date 之间的所有天数。to_date如果我计算 from_date 和 to_date 之间的所有天数,它们的情况可能会超过我的 end_date 并因此给出错误的数据。

标签: phplaravel

解决方案


你会做这样的事情

$baseQuery = $baseQuery->where(function ($query) use ($date_created_from, $date_created_to) {
    if (isset($date_created_from) && $date_created_from != '') {
        $dateFrom = Carbon::parse($date_created_from)->format('Y-m-d');
        $query->whereDate('date_column', '>=', $dateFrom);
    }

    if (isset($date_created_to) && $date_created_to != '') {
        $dateEnd = Carbon::parse($date_created_to)->format('Y-m-d');
        $query->whereDate('date_column', '<=', $dateEnd); 
    } 
});

在哪里

  1. $baseQuery是您为执行所有选择、聚合等而编写的查询。

上面的代码考虑了空值,此外,您可以在将查询附加到基本查询之前执行其他检查,例如“日期从不大于今天前 1 周”。


推荐阅读