【问题标题】:Laravel mutate date before saving to database?Laravel 在保存到数据库之前更改日期?
【发布时间】:2017-04-13 03:31:39
【问题描述】:

我在日期选择器中选择了一个日期,格式如下

Y-m-d g:i A

所以使用上午/下午,它在我的输入字段中显示以下内容,这是正确的

当我提交表单时,Laravel 不会更新记录,因为格式对于我在 mysql 中的 DATETIME 字段是未知的。

我的“日期”字段已添加到 $dates 数组中,因此它应该由 Laravel 解析

我尝试在我的模型上使用 Mutator,如下所示,但没有成功

public function setDateAttribute($value)
{
    $this->attributes['date'] = Carbon::createFromFormat('Y-m-d g:i A', $value)->format('Y-m-d H:i:s');
}

原始值未更新。 知道我可能做错了什么吗?

谢谢

【问题讨论】:

  • 提交表单时是否出现异常?
  • 不!它只是不会更新我数据库中的值

标签: php mysql laravel datetime


【解决方案1】:

看看 Laravel 的 date mutators,它会为您处理进出数据库的访问和变异日期,就像处理 created_at 和其他默认日期一样。

基本上,您需要将date 字段添加到模型上的$dates 数组中,如下所示:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The attributes that should be mutated to dates.
     *
     * @var array
     */
    protected $dates = [
        'created_at', // Add if you're using timestamps on the model
        'updated_at', // Add if you're using timestamps on the model
        'deleted_at', // Add if you're using softDeletes on the model
        'date'
    ];
}

这样,当模型被持久化到数据库时,它以DATETIME 的形式完成,而当它从数据库读取到您的模型中时,它将是Carbon 实例

【讨论】:

  • 感谢您的回答,已经是这样了。我忘了把它添加到我的问题中,我现在就添加它。
【解决方案2】:

看来你的碳功能没问题。但是为什么它不起作用,不明白。但我有使用 PHP 日期函数的解决方案。

public function setDateAttribute($value)
{
    $this->attributes['date'] = date("Y-m-d H:i:s", strtotime($value);
}

【讨论】:

    【解决方案3】:

    Laravel 的日期修改器需要像 'Y-m-d H:i:s' 这样的格式,但您可以在模型上使用 $dateFormat 属性来指定不同的格式。例如:

    protected $dateFormat = 'Y-m-d g:i A';
    

    查看Date Mutators下文档中的日期格式部分

    或者,您可以在模型之外使用 Carbon 解析日期,因为 $dates 中列出的属性也将接受 Carbon 实例:

    $model->date = Carbon::createFromFormat('Y-m-d g:i A', '2016-11-29 02:00 PM');
    

    这是我通常使用的方法。对我来说,这更像是一个前端问题,您试图将用户友好的格式映射到您的模型/数据库所期望的格式,因此我通常会将这个逻辑放入控制器中。

    【讨论】:

    • 非常感谢!我对这一切感到很困惑。使用默认值将其保存在数据库中确实很明显,但以其他方式显示它,然后在控制器中重新转换它。
    猜你喜欢
    • 2020-01-18
    • 2021-03-04
    • 2017-05-17
    • 2013-03-10
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    相关资源
    最近更新 更多