laravel created_at value

k7fdbhmy  于 2023-10-22  发布在  其他
关注(0)|答案(4)|浏览(101)

我尝试将日期插入到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中设置特定日期而不是默认日期?

hsgswve4

hsgswve41#

你的模型有可填充或保护的数组吗?
如果是,create方法将跳过不可批量赋值的字段。
如果你想填写自己的,你可以这样做:

$product = app(Product::class);
$product->timestamps = false; // disable timestamps for this creation

// set what you want to set
$product->product_id = $id;
$product->shop_name = $shop;
$product->created_at = $datetime; // <- datetime here
$product->save();

但是,如果您查看代码(vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasTimestamps.php),并且created_at字段是可填充的,则如果在创建期间设置了该字段,则不应设置其他值。(参见isDirty检查)
如果你不想使用created_at和updated_at,只需在模型中将时间戳设置为false:

public $timestamps = false;
gjmwrych

gjmwrych2#

我认为你必须在你的模型中设置时间戳为false

timestamps = false;
sh7euo9m

sh7euo9m3#

这是一个相当老的问题,但我想我应该补充一下,你也可以使用Model::unguard()方法暂时禁用模型上的质量分配,这也将允许你动态地为created_at设置自定义值,以及其他受MA保护的值。请注意,它还级联到子关系,如下所示:

$user = Auth::user();

    User::unguard();

    $user->drill_completions()->create([
        'day' => null,
        'sequence_completed_at' => Carbon::now(),
        'created_at' => Carbon::now()->subHours(32) // unguard has been set on the parent model, but here we are using it to enable setting created_at on the child relationship
    ]);

    User::reguard();

如上所述,您可以使用Model::reguard();再次重置。

rbl8hiat

rbl8hiat4#

在这样的情况下,单步执行Laravel框架代码本身是很有帮助的。
如果你看一下Builder::create(),你会发现它只是一个创建新模型示例并保存它的方便方法。
这最终调用了Model::performInsert(),它在执行插入之前调用了HasTimestamps trait的updateTimestamps()方法。
HasTimestamps::updateTimestamps()中,你会看到它只在属性不是“dirty”的情况下设置created_at。它将是脏的,因为你已经显式地设置了它(参见HasAttributes::isDirty())。
长话短说,行为应该是,如果您专门指定created_at,您的值将覆盖默认值。如果不是,很可能是因为您以排除时间戳的方式设置了模型的$guarded或$fillable属性。

相关问题