无法找到两位数的月份Laravel的Carbon缺少数据

时间:2017-07-07 05:19:22

标签: php laravel laravel-5.4 php-carbon

我正在Laravel 5.4上构建一个小应用程序我正在尝试从前端接收来自datepicker小部件的日期并将其解析为Carbon日期格式,如下所示:

Carbon\Carbon::parse($request->schedule)->toDateTimeString();

继续我以前的问题:How to format date receiving through Vuejs Datepicker in laravel,我成功将其添加到我的数据库中,并在调用它时,我在我的模型中放置一个访问器并尝试以diffForHumans()格式获取日期这是我之前的问题:A two digit month could not be found Data missing in Laravel,每当我提取模型时,这都完美无缺,直到我没有将此调度属性分配给任何其他变量,现在在控制器中检索模型并分配给一个像这样的值:

public function getData()
{
    $user = Auth::user();
    $summaries = InteractionSummary::all();
    $meetings = [];
    foreach($summaries as $summary)
    {
        $company = [];
        $tempData = $summary->interaction->where('user_id', $user->id)->get()->first();
        if($tempData)
        {
            $meeting = Interaction::find($tempData->id);
            $tempData->schedule = $meeting->schedule;
            $meetings[] = $tempData;
        }
    }
    return response()->json(['meetings' => $meetings], 200);
}

我收到同样的错误:

  

无法找到两位数的数据

如果我做的话,同样的工作也很好:

public function getFutureData()
{
    $user = Auth::user();
    $currentTime = Carbon::now();
    $interactions = $user->interaction->where('schedule', '>=', $currentTime);
    $meetings = [];
    foreach($interactions as $interaction)
    {
        $interaction->meeting = $meeting;
        $meetings[] = $interaction;
    }
    return response()->json(['interactions' => $meetings], 200);
}

在我的模型中使用名称:Interaction我将我的属性定义为:

public function getScheduleAttribute($value)
{
    return Carbon::parse($value)->diffForHumans();
}

修改

仅供参考:我正在使用我的InteractionSummary模型,并且有以下关系:

public function interaction()
{
    return $this->belongsTo('App\Interaction');
}

3 个答案:

答案 0 :(得分:3)

肯定你的问题是由这一行引起的:

$tempData->schedule = $meeting->schedule;

原因是,您有设置日期列(请参阅链接问题),如下所示:

protected $dates = [
'schedule', 'created_at', 'updated_at', 'deleted_at'
];

所以'时间表'被视为日期。

当您通过 $ meeting->时间表检索您的日程安排日期时,您的mutator会修改该值,并最终得到类似'1小时前'的内容。

因此,使用 $ tempData-> schedule = $ meeting-> schedule; ,您实际上是在尝试为$ tempData->计划设置无效日期。它将翻译为

$tempData->schedule = '1 hour ago';

当你在日期数组中将'schedule'标记为日期时,Laravel正试图用Carbon解析它。它希望以模型的$ dateFormat属性中指定的格式包含日期(默认为Y-m-d H:i:s)。

答案 1 :(得分:1)

正如@shock_gone_wild所说,如果你有'安排'在$ dates数组中,

protected $dates = [
'schedule', 'created_at', 'updated_at', 'deleted_at'
];

Laravel将为您提供Carbon \ Carbon实例。

如果是你的情况,你应该在发送之前格式化(否则它将是一个Carbon对象)。

$tempData->schedule = $meeting->schedule->format('Y-m-d');

答案 2 :(得分:0)

试试这个:

public function getData()
{
   $user = Auth::user();
   $summaries = InteractionSummary::all();
   $meetings = [];
   foreach($summaries as $summary)
   {
       $company = [];
       $tempData = $summary->interaction->where('user_id', $user->id)->get()->first();
       if($tempData)
       {
           $meetings[] = $tempData;
       }
   }
   return response()->json(['meetings' => $meetings], 200);