php - Eloquent 模型创建期间出错 - 增变器执行但插入语句中不存在突变日期字段 - Laravel 5.4

标签 php mysql laravel-5 eloquent php-carbon

mySQL DATE 格式是 Y-m-d 出于本地化原因,用户以 d-m-Y 形式向我的 Laravel 5.4 应用程序提交日期字段,这些日期字段被保存到 mySQL 中的 detenutodal 字段。

我在我的 Attore 模型中使用了 mutators 来转换这两种格式,就像这样。

<?php
namespace App;

//use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;

class Attore extends Model
{

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

    /**
     * detenutodal: DB Y-m-d => m-d-Y
     *
     * @param  date  $value
     * @return date
     */
    public function getDetenutodalAttribute($value)
    {
        return Carbon::parse($value)->format('d-m-Y');
    }

    /**
     * detenutodal: m-d-Y => DB Y-m-d 
     *
     * @param  date  $value
     * @return date
     */
    public function setDetenutodalAttribute($value)
    {
        return Carbon::parse($value)->format('Y-m-d');
    }
}

如您所见,detenutodal 属性被添加到 $dates 以使其成为 Carbon 实例(似乎没有声明没有区别。实际上我无法让 detenutodal 表现得像 Carbon 实例,我不得不显式调用 Carbon::parse)

我在 AttoreController 中创建了一个新的 Attore 模型,如下所示:

$this->validate(request(), [
    'detenutodal' =>'nullable|date_format:"d-m-Y"',
    ]);

Attore::create(request()->all());

已正确验证 detenutodal 字段,并且我确信在我 dd 对其调用时调用了增变器。正确的 detenutodal 值被传递给它 - 例如30-06-1943 并返回 1943-06-30

但是 create 失败并出现以下错误:

SQLSTATE[HY000]: General error: 1364 Field 'detenutodal' doesn't have a default value (SQL: insert into `attores` (`nome`, `enteopersona`, `paternita`, `maternita`, `annonascita`, `luogonascita`, `residenza`, `professione`, `gradoistruzione`, `updated_at`, `created_at`) values (Aminto Pestalozzi, persona, Agenore Pestalozzi, Giacinta Tortelazzi, 1910, Caorso in Strà' lva', Via Morigi 4, Caorso, Bracciante, Scuola professionale, 2017-05-18 14:23:22, 2017-05-18 14:23:22))

如您所见,mySQL 提示 detenutodal 没有默认值,因为 detenutodal 已从查询中完全消失,而我希望突变器正确更新字段在调用 Attore::create 并将其添加到查询之前。

任何人都可以解释一下吗?

谢谢

最佳答案

编辑:你的修改器是错误的。

public function setDetenutodalAttribute($value)
{
    $this->attributes['detenutodal'] = Carbon::parse($value)->format('Y-m-d');
}

您需要设置 fillable 属性。

protected $fillable = ['detenutodal'];

或者把守卫设置成这样

protected $guarded = [];

您允许日期为空值,这个字段是否可以为空?

关于php - Eloquent 模型创建期间出错 - 增变器执行但插入语句中不存在突变日期字段 - Laravel 5.4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44048040/

相关文章:

php - WordPress is_home() || is_index() 可能吗?

mysql - 根据mysql中的列更改查询结果

php - 来自 $_POST 的 SQL SELECT 语句

php - Laravel Socialite 410 Gone 此资源在 v1 API 下不再可用

javascript - JQuery 未读取 JSON 数组值

php - 当用户按下按钮时,如何从 View 中更改模型内的值?

php - Laravel 模型工厂和 Eloquent;设定日期

php - Auth::user() 返回 null

php - 如何在laravel 5.4 的迁移文件中使用原始mysql 语句?

php - .txt 写入 .json 文件批处理或需要 php 文件