我尝试将日期插入到created at中,但没有任何效果
我试着正常使用create
$this->create([ 'product_id' => "$id", 'shop_name' => $shop,'created_at' => $date ]);
我试着改变日期格式来匹配laravel
$date = date('Y-m-d H:i:s',strtotime($id['created_at']));
我还尝试使用mutators来每次更改值
public function setFirstNameAttribute($value)
{
$this->attributes['created_at'] = $value;
}
如何在created_at
中设置特定日期而不是默认日期?
4条答案
按热度按时间hsgswve41#
你的模型有可填充或保护的数组吗?
如果是,
create
方法将跳过不可批量赋值的字段。如果你想填写自己的,你可以这样做:
但是,如果您查看代码(
vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasTimestamps.php
),并且created_at字段是可填充的,则如果在创建期间设置了该字段,则不应设置其他值。(参见isDirty
检查)如果你不想使用created_at和updated_at,只需在模型中将时间戳设置为false:
gjmwrych2#
我认为你必须在你的模型中设置时间戳为false
sh7euo9m3#
这是一个相当老的问题,但我想我应该补充一下,你也可以使用
Model::unguard()
方法暂时禁用模型上的质量分配,这也将允许你动态地为created_at
设置自定义值,以及其他受MA保护的值。请注意,它还级联到子关系,如下所示:如上所述,您可以使用
Model::reguard();
再次重置。rbl8hiat4#
在这样的情况下,单步执行Laravel框架代码本身是很有帮助的。
如果你看一下
Builder::create()
,你会发现它只是一个创建新模型示例并保存它的方便方法。这最终调用了
Model::performInsert()
,它在执行插入之前调用了HasTimestamps trait的updateTimestamps()
方法。在
HasTimestamps::updateTimestamps()
中,你会看到它只在属性不是“dirty”的情况下设置created_at
。它将是脏的,因为你已经显式地设置了它(参见HasAttributes::isDirty()
)。长话短说,行为应该是,如果您专门指定
created_at
,您的值将覆盖默认值。如果不是,很可能是因为您以排除时间戳的方式设置了模型的$guarded或$fillable属性。