Laravel:获取本周两个日期之间的模型

时间:2017-02-01 10:38:29

标签: php laravel date eloquent where

我有一个雄辩的模型,我有两列'startdate'和'enddate'。我想显示当前正在进行的所有模型,即“startdate”和“enddate”之间的任何日期,它们与当前周的任何日期相匹配。 我首先试图只使用这样的startdate:

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

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

但很自然地,任何一周以前开始但仍在进行的事情('enddate'尚未完成)都不会出现。

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

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

编辑2:一些样本数据和预期结果。

DB中的数据:

--------------------------------------------------
| 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日 - 5月17日。

我希望ID为1,3,4的模型;
就像两个日期(startOfWeek和endOfWeek)中正在进行的所有模型一样。

1 个答案:

答案 0 :(得分:1)

如果定义2个可能的输出

,问题就很简单了
  1. 您的模型有开始和结束日期
  2. 您的模型只有开始日期(结束日期为空)
  3. 您已经介绍过的第一个输出,所以只需要掩盖第二个输出

    您的查询应该与两个输出相似

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

    它可能需要一些调整(如果您本周检查并且您想要输出仍在进行的模型,我可能不需要完全理解您可能在几周前开始等)。尝试一下,如果还有其他条件可以随意询问。