Laravel 中的 Carbon 中找不到两位数的月份数据

A two digit month could not be found Data missing in Carbon in Laravel

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

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

继续我之前的问题: , I successfully added this to my database, and while calling it I'm placing an accessor in my model and trying to fetch the date in diffForHumans() format which was my previous question: ,每当我获取模型时,这都工作得很好,直到我没有将这个 schedule 属性分配给任何其他变量,现在在检索模型时控制器并用这样的东西分配给一个值:

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);
}

我遇到了同样的错误:

A two digit month could not be found Data missing

如果我这样做,同样的工作非常好:

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');
}

您的问题很可能是由以下行引起的:

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

原因是,您设置了这样的日期列(参见链接的问题):

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

因此 'schedule' 被视为日期。

当您通过 $meeting->schedule 检索您的日程安排日期时,该值会被您的修改器修改并以类似“1 小时前”的形式结束。

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

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

当您在日期数组中将 'schedule' 标记为日期时,Laravel 正在尝试使用 Carbon 对其进行解析。它期望日期采用模型的 $dateFormat 属性中指定的格式(默认为 Y-m-d H:i:s)。

正如@shock_gone_wild所说,如果你的$dates数组中有'schedule',

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

Laravel 会给你一个 Carbon\Carbon 实例。

如果是这种情况,您应该在发送之前进行格式化(否则它将是 Carbon 对象)。

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

试试这个:

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);