Eloquent 模型创建期间出错 - 增变器执行但插入语句中不存在突变日期字段 - Laravel 5.4
Error during Eloquent Model Creation - mutator executes but mutated Date field not present in insert statement - Laravel 5.4
mySQL 日期格式为 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
并且 returns 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
并将其添加到查询之前。
任何人都可以解释一下吗?
谢谢
detenutodal 字段为空并且在 mysql 引擎中没有默认值请从控制器开始转储您的 detenutodal 字段首先检查它是否有值然后检查值是否为日期时间值。
您没有明确允许 detenutodal
字段为 "filled"。
Laravel 默认有针对 Mass Assignment
的安全机制
这应该可以解决问题。
protected $fillable = ['detenutodal'];
编辑:你的修改器是错误的。
public function setDetenutodalAttribute($value)
{
$this->attributes['detenutodal'] = Carbon::parse($value)->format('Y-m-d');
}
您需要设置可填充属性。
protected $fillable = ['detenutodal'];
或者设置守卫为so
protected $guarded = [];
您允许日期为空值,这个字段可以为空吗?
mySQL 日期格式为 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
并且 returns 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
并将其添加到查询之前。
任何人都可以解释一下吗?
谢谢
detenutodal 字段为空并且在 mysql 引擎中没有默认值请从控制器开始转储您的 detenutodal 字段首先检查它是否有值然后检查值是否为日期时间值。
您没有明确允许 detenutodal
字段为 "filled"。
Laravel 默认有针对 Mass Assignment
的安全机制这应该可以解决问题。
protected $fillable = ['detenutodal'];
编辑:你的修改器是错误的。
public function setDetenutodalAttribute($value)
{
$this->attributes['detenutodal'] = Carbon::parse($value)->format('Y-m-d');
}
您需要设置可填充属性。
protected $fillable = ['detenutodal'];
或者设置守卫为so
protected $guarded = [];
您允许日期为空值,这个字段可以为空吗?