将日期添加到查询结果中不存在的数组 - Laravel 5

Add Dates To Array That Don't Exist In Query Result - Laravel 5

所以,我遇到了障碍。希望我能解释清楚。

我正在创建自定义每周日历以显示给定周的 'tasks' - 周日到周六。

我有以下代码,它正在抓取指定数据范围内的所有任务(正常工作)。

但是,我想在我的视图中显示 7 个面板,每个面板代表星期几。我将在我的 @foreach 视图本身中执行此操作(我还没有解决)。

问题是,如果一周只有 2 个任务,比如周日和周二,我将无法在我的视图中为一周中剩余几天没有任何任务的空面板创建.

如何确保数组中包含一周的所有日期 - 即使他们没有分配给他们的任务?或者有更好的方法吗?

在控制器中:

$weekly_tasks = Auth::user()->tasks()->withinDateRange($beginning_of_week, $end_of_week)->get();

foreach ($weekly_tasks as $task) {
    $date = new Carbon($task['date']);
    $days[$date->toFormattedDateString()][] = $task;
}

return $days;

模型范围:

public function scopeWithinDateRange($query, $start, $end)
{
    return $query->whereBetween('date', [$start->subDays(1), $end]);
}

$days 数组 return 是这样的,仅供参考:

{
"Mar 22, 2015": [
    {
        "id": 1,
        "task": "stuff",
        "date": "2015-03-22 23:06:23"
    }
],
"Mar 24, 2015": [
    {
        "id": 2,
        "task": "more stuff",
        "date": "2015-03-22 23:06:23"
    }
],
}

数组应该 return 像这样:

{
"Mar 22, 2015": [
    {
        "id": 1,
        "task": "stuff",
        "date": "2015-03-22 23:06:23"
    }
],
"Mar 23, 2015": [
],
"Mar 24, 2015": [
    {
        "id": 2,
        "task": "more stuff",
        "date": "2015-03-22 23:06:23"
    }
],
"Mar 25, 2015": [
],
"Mar 26, 2015": [
],
"Mar 27, 2015": [
],
"Mar 28, 2015": [
],
}

您可以使用一周中的所有天作为指向空数组的键来初始化 $days 数组,然后将所有任务附加到相应的数组。

我以前从未使用过 Laravel,但 google 很快就想到我可以获取本周开始的 Carbon,并将 FormattedDateString 添加为键。然后使用 ->tomorrow() 获取第二天并冲洗'n 重复直到你到达周末。 不过可能有更好的方法,所以只有在遇到困难时才使用它。

编辑: 假设 ($beginning_of_week, $end_of_week) 是 Carbon 对象:

$days = array();
$iterator = $beginning_of_week;
while ( $iterator->lte($end_of_week)){
    $days[$iterator->toFormattedDateString()] = array();
    $iterator->addDay();
}

这会初始化您的 $days,然后使用您的 foreach。

定义周数组(你应该动态定义这个数组)和一个空的$weekly_tasks_data数组。然后遍历该数组,将数据复制到新数组 $weekly_tasks_data,如果数据存在的话。

$week_arr = array("Mar 22, 2015", "Mar 23, 2015", "Mar 24, 2015", "Mar 25, 2015", "Mar 26, 2015", "Mar 27, 2015", "Mar 28, 2015");
$weekly_tasks_data = array();
foreach($week_arr as $k => $v) {
    if(array_key_exists($v, $weekly_tasks))
        $weekly_tasks_data[$v] = $weekly_tasks[$v];
    else
        $weekly_tasks_data[$v] = array();
}