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

时间:2015-03-23 03:26:25

标签: php laravel laravel-5

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

我正在创建一个自定义的每周日历来显示给定周的“任务” - 从周日到周六。

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

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

问题是,如果本周只有2个任务,比如在星期日和星期二,我将无法在我的视图中创建空白面板,以便在一周剩下的几天内没有任何任务。< / p>

如何确保阵列中包含所有星期的日期 - 即使他们没有分配任务?或者有更好的方法吗?

在控制器中:

$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数组返回类似于这个FYI的内容:

{
"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"
    }
],
}

数组应返回如下内容:

{
"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": [
],
}

2 个答案:

答案 0 :(得分:1)

您可以将$ days数组初始化为一周的所有日期,因为键指向空的空数组,然后将所有任务追加到相应的数组中。

我之前从未使用过Laravel,但是快速谷歌认为你可以获得本周开始时的Carbon,并添加FormattedDateString作为键。然后在第二天使用 - &gt;明天()并冲洗并重复直到你到达周末。 可能有一种更好的方法,所以只有在你被困住时才使用它。

编辑: 假设($ 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一起。

答案 1 :(得分:0)

定义周数组(您应该动态定义此数组)和空$ 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();
}