Laravel / Carbon Timestamp 0000-00-00 00:00:00或发现意外数据。发现意外数据。数据丢失

时间:2014-08-25 11:29:31

标签: php mysql date laravel laravel-4

我在数据库中有一个时间戳,我正试图让猪保存。我或者遇到MySQL时间戳为空或我收到错误的问题。发布的格式是英国标准。

发布数据,我尝试了以下一些方法:

$user['crb_date'] = Carbon::createFromFormat('d/m/Y', $data['crb_date']);

$user['crb_date'] = Carbon::createFromFormat('d/m/Y', $data['crb_date'])->toDateTimeString();

// Plus many other more std date(), strtodate() combos

在我的模型上,我有自定义getDates,它会将日期转换为Carbon:

public function getDates()
{
    return [
        'last_login',
        'created_at',
        'updated_at',
        'dob',
        'crb_date'
    ];
}

现在,如果我使用碳日期更新用户,我会遇到以下问题:

Unexpected data found. Unexpected data found. Data missing

但是,如果我在第二次碳转换后我dd($user['crb_date']

string '2011-05-01 11:20:23' (length=19)

这对我来说非常好。

如果我删除模型上的访问者,我会发布它,但是,我得到空白时间戳

0000-00-00 00:00:00

我还尝试在模型上放置一个mutator来设置日期,但问题完全一样。

我能做些什么才能让它发挥作用?我认为这可能与导致问题的访问者有关,但需要更好地处理日期之后。

非常感谢您抽出宝贵时间提供帮助。

这是我尝试过的变种 - 它是在模型上设置的。但是,上面的代码(Carbon :: createFormFormat ...目前在我的回购中:

public function setCrbDateAttribute($value)
{
     $this->attributes['crb_date'] = \Carbon\Carbon::createFromFormat('d-m-Y h:i', $value);
}

访问者:

public function getDates()
{
    return [
        'last_login',
        'created_at',
        'updated_at',
        'dob',
        'crb_date'
    ];
}

排序!

感谢下面的WereWolf的回答,我调整了Model mutator,它现在的工作就像一个魅力。这就是我现在所拥有的:

public function setCrbDateAttribute($value)
{
    $this->attributes['crb_date'] = \Carbon\Carbon::createFromFormat('d/m/Y', $value)->toDateTimeString();
}

1 个答案:

答案 0 :(得分:4)

问题出在你的date字符串中,例如,你有这个:

public function setCrbDateAttribute($value)
{
     $this->attributes['crb_date'] = \Carbon\Carbon::createFromFormat('d-m-Y h:i', $value);
}

现在,如果有10-12-2014之类的日期,则会发生此错误,因为缺少hourminute。因此,请确保日期包含所有分区,并确保日期字符串包含-作为分隔符而不是/

换句话说,在使用$value之前检查Carbon,并确保您的日期字符串包含您在方法中使用的完全相同的格式化字符串。

这也发生在accessor方法中,因此请先在Carbon::createFromFormat()中使用之前检查日期值。

如果您从用户输入中获取日期,请在使用datedate_format:format规则check the validation here之前验证日期之前。