mySQL DATE格式为Y-m-d
出于本地化原因,用户以d-m-Y
形式向我的Laravel 5.4应用程序提交日期字段,这些字段保存到mySQL中的detenutodal
字段。
我使用mutators来转换我的Attore
模型中的两种格式,就像这样。
<?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
)
我在Attore
中创建了一个新的AttoreController
模型,如下所示:
$this->validate(request(), [
'detenutodal' =>'nullable|date_format:"d-m-Y"',
]);
Attore::create(request()->all());
detenutodal字段已正确验证,我确信调用mutator是因为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
已完全从查询中消失,而我希望mutator在调用{{{{{}之前正确更新该字段1}}并将其添加到查询中。
任何人都能解释一下吗?
由于
答案 0 :(得分:0)
detenutodal字段为空且在mysql引擎中没有默认值,请先从控制器转储你的detenutodal字段,检查它是否有值,然后检查value是否为datetime值。
答案 1 :(得分:0)
您没有明确允许detenutodal
字段填充&#34;。
Laravel默认使用Mass Assignment
的安全机制这应该解决它。
protected $fillable = ['detenutodal'];
答案 2 :(得分:0)
编辑:你的mutator错了。
public function setDetenutodalAttribute($value)
{
$this->attributes['detenutodal'] = Carbon::parse($value)->format('Y-m-d');
}
您需要设置可填充属性。
protected $fillable = ['detenutodal'];
或将守卫设置为
protected $guarded = [];
你允许日期的可空值,这个字段是否可以为空?