【问题标题】:Override created_at value覆盖 created_at 值
【发布时间】:2022-02-06 04:07:03
【问题描述】:

我正在尝试将日期插入创建时间,但没有任何效果

我尝试正常使用 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']));

我还尝试让用户修改器每次都更改值

public function setFirstNameAttribute($value)
{
    $this->attributes['created_at'] = $value;
}

如何在created_at 中设置特定日期而不是默认日期?

【问题讨论】:

  • 好吧,你在mutator中的属性不是created_at创建的,但是在创建时设置created_at的值应该可以。你有错误吗?
  • @Devon 我改成了created_at,反正没解决,值没有被覆盖,所有记录的存储日期都是'2018-02-06'。我真的不知道为什么!
  • 首先,您需要退后一步,考虑更改 created_at 日期是否合理。通常,您永远不需要更改该日期。
  • @apokryfos 我正在使用 API,我必须更改它以匹配其他数据库,否则我不会尝试更改它
  • 在这种情况下,您应该使用API_created_dateAPI_updated_date 等日期字段来定义您的表格,以表明它们实际包含的内容。更直观,更新没有问题。如果你现在对项目不太深入,我建议你改变它

标签: php laravel date laravel-5 laravel-5.5


【解决方案1】:

您是否为您的模型设置了可填充或受保护的数组?

如果是这样,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;

【讨论】:

  • 我用过 Laravel v5.5。我不必使用$product-&gt;timestamps = false;。此外,我刚刚使用过这个:$product-&gt;setCreatedAt($datetime);
【解决方案2】:

我认为您必须将模型中的时间戳设置为 false

timestamps = false;

【讨论】:

    【解决方案3】:

    这是一个很老的问题,但我想我要补充一点,您还可以使用 Model::unguard() 方法暂时禁用模型上的质量分配,这也可以让您在飞,以及任何其他受 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(); 再次重置。

    【讨论】:

      猜你喜欢
      • 2014-08-24
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 2011-12-20
      • 2016-12-27
      • 2013-09-02
      相关资源
      最近更新 更多