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

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

现在,如果我用Carbon日期更新用户,会出现以下问题:
意外发现数据。意外发现数据。数据丢失。
但是,如果我在第二次Carbon日期转换后使用dd($user['crb_date'],我得到了以下结果:
字符串'2011-05-01 11:20:23'(长度=19)
这看起来非常好。
如果我删除模型上的访问器,则可以发布它,但是我会得到空白时间戳 0000-00-00 00:00:00 我还尝试在模型上放置一个修改器来设置日期,但问题完全相同。
有什么想法可以让它工作?我认为这可能与访问器引起的问题有关,但之后需要更好地处理这些日期。
非常感谢您抽出时间帮助。
这是我尝试过的修改器——它被设置在模型上。但是,上面的代码(Carbon::createFormFormat...)目前在我的repo中。
public function setCrbDateAttribute($value)
{
     $this->attributes['crb_date'] = \Carbon\Carbon::createFromFormat('d-m-Y h:i', $value);
}

访问器(Accessor):

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

已排序!

感谢下面WereWolf的回答,我调整了模型变异器,现在它像魔法一样运作良好。这是我现在拥有的:

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

当你说“删除模型的访问器”时,是从getDates()中删除你的日期属性还是从getFooAttribute()中删除? - JofryHS
你的 accessor 方法在哪里? - The Alpha
@JofryHS,是的。我已经移除了整个getDates()方法,当发布时,我获得空白时间戳。 - T2theC
你的模型中是否有像 getCreatedAtAttribute 这样的访问器方法? - The Alpha
1
@WereWolf - Alpha,我会更新原帖。谢谢大家。 - T2theC
1个回答

4
问题在于你的日期字符串,例如你有这样一个字符串: date
public function setCrbDateAttribute($value)
{
     $this->attributes['crb_date'] = \Carbon\Carbon::createFromFormat('d-m-Y h:i', $value);
}

如果日期格式为10-12-2014,则会出现错误,因为小时和分钟缺失。所以确保日期包含所有部分,并且确保日期字符串包含-作为分隔符而不是/
换句话说,在使用Carbon之前,检查$value并确保您的日期字符串与方法中使用的格式相同。
accessor方法中也可能发生这种情况,因此在使用Carbon::createFromFormat()之前先检查日期值。
如果从用户输入中获取日期,则使用datedate_format:format规则验证日期后再使用,可以在这里进行验证

谢谢。然而,我已经使用了这个:$ user['crb_date'] = Carbon :: createFromFormat('d / m / Y',$ data ['crb_date'])-> toDateTimeString(); 这将生成字符串:2011-05-01 11:20:23。应该没问题了吧? 我一直在尝试使用mutator。您认为我应该在Model上处理它而不是Repo吗?我会试一下。干杯。 - T2theC
我认为它应该在你的模型方法中。 - The Alpha
太棒了,谢谢WereWolf - 神话一般的存在。当限制解除后,我会更新原始帖子以显示我的做法并点赞。非常感谢你,伙计 - 神话一般的存在。 - T2theC
欢迎!很高兴知道它对您有帮助,也点赞了 :-) - The Alpha
Carbon本身应该检查字符串是否具有正确的格式。 - jplozano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接