【问题标题】:Laravel: Get models where between two dates in this weekLaravel:获取本周两个日期之间的模型
【发布时间】:2017-02-01 10:38:28
【问题描述】:

我有一个雄辩的模型,其中有两列“开始日期”和“结束日期”。我想显示本周正在进行的所有模型,即“开始日期”和“结束日期”之间与本周任何日期匹配的任何日期。 我首先尝试只使用这样的开始日期:

$startOfWeek = Carbon::now()->startOfWeek()->startOfDay();
$endOfWeek = Carbon::now()->endOfWeek()->endOfDay();

$modelThisWeek = Model::whereBetween('startdate', [$startOfWeek, $endOfWeek])->get();

但很自然,一周前开始但仍在进行中(“结束日期”尚未完成)的任何内容都不会显示。

我怎样才能有效地获得本周有效的所有模型?

编辑:所以我有点想做(现在听起来很愚蠢)是获取 'startdate' 和 'enddate' 之间的所有日期,例如在一个数组中,获取当前日期之间的所有日期的第二个数组week 并像 array_intersect 一样使用并获取这些模型。我希望这次我解释得更清楚一点。

编辑 2:一些示例数据和预期结果。

数据库中的数据:

--------------------------------------------------
| ID | some_other_col | startdate  | enddate      |
--------------------------------------------------
| 1  | ...            | 12. Jan 17 | 20. Feb 17   |
--------------------------------------------------
| 2  | ...            | 12. Jan 17 | 18. Jan 17   |
--------------------------------------------------
| 3  | ...            | 30. Jan 17 | 04. Feb 17   |
--------------------------------------------------
| 4  | ...            | 04. Feb 17 | 07. Feb 17   |
--------------------------------------------------
| 5  | ...            | 08. Feb 17 | 10. Feb 17   |
--------------------------------------------------

如果我想要本周内的所有模型:
29. 1 月 17 日 - 05. 2 月 17 日

我期望 ID 为 1、3、4 的模型;
与两个日期(startOfWeek 和 endOfWeek)内正在进行的所有模型一样。

【问题讨论】:

  • 你能像Model::whereBetween()->whereBetween()->get()一样拨打whereBetween 2次吗?
  • 你可以这样做,但我只会得到本周开始日期和结束日期在本周的模型。如果开始日期是两个月前,结束日期是 3 周后呢?
  • 这可能会有所帮助stackoverflow.com/questions/26082043/… 我不会使用 eloquent - 似乎 orWhereBetween 可以提供帮助!?
  • 那也不行,在那个anwser上我只会得到那些开始日期在本周之间的模型和结束日期在本周之间的那些模型,但不是那些模型startdate 和 enddate 不在当前周内,但当前周在 startdate 和 enddate 之间。

标签: php laravel date eloquent where


【解决方案1】:

如果你定义 2 个可能的输出,你的问题就很简单了

  1. 您的模型有开始和结束日期
  2. 您的模型只有开始日期(结束日期为空)

你已经覆盖了第一个输出,所以只需要覆盖第二个输出

你的查询应该看起来像两个输出

$modelThisWeek = Model::where(['startdate','>='$startOfWeek],
                              ['enddate','<=', $endOfWeek])
               ->orWhere(function ($query) {
                   $query->where('enddate', '>',  $endOfWeek);
               })
           })->get();

它可能需要一些调整(如果您在本周检查并且您希望输出仍在持续的模型,该模型可能在几周前开始等)。试试看,如果还有其他条件,请随时询问。

【讨论】:

  • 是的,我希望模型仍在进行中,即几周前开始的。没有没有和 enddate 的模型,所以 'orWhere' 永远不会给出一些东西,第一个实际上只在一周内给出这些带有 start- 和 enddate 的东西。
  • @AgashThamo。检查更新的答案,我认为这现在应该可以工作了
  • 遗憾的是,我编辑了我的问题,以便更清楚地解释我想要做什么。没有 startdate 或 enddate = null 的模型。这是一个必填字段。不过还是谢谢:)
  • 告诉我仍在进行中的模型的结束日期是什么,并在我的查询中的内部位置用 null 替换该值
  • 我太愚蠢了。如果我稍微调整一下,你的回答可能是正确的。我认为,所有正在进行的模型都将是 enddate 大于 startOfTheWeek 变量的地方,就像那样简单。我现在得去测试一下。
猜你喜欢
  • 1970-01-01
  • 2012-04-15
  • 2017-11-16
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 2011-03-22
相关资源
最近更新 更多