【问题标题】:Setting dates as nullable in laravel在 laravel 中将日期设置为可为空
【发布时间】:2018-02-22 19:00:30
【问题描述】:

我很难理解 laravel 中日期字段的内部工作原理。我有一个名为 called_at 的自定义日期字段,我在架构中将其设置为可为空。由于是日期字段I would naturally want it to be a Carbon instance,所以在模型中我将此属性推送到$dates数组中。

protected $dates = ['called_at'];

为了能够通过request('called_at') 输入从控制器设置它,我必须在模型中设置一个mutator。所以我这样设置:

public function setCalledAtAttribute($date){
    $this->attributes['called_at'] = Carbon::parse($date);
}

但问题是,即使用户没有在输入字段中提供日期,called_at 属性也会设置为当前时间戳!但我希望它为 NULL。

为了摆脱它,我注释掉了setCalledAtAttribute mutator。但现在它甚至不会接受输入:

InvalidArgumentException 数据丢失

底线,我如何将我的日期字段设置为空,这样当用户将输入字段留空时,called_at 字段不会设置为当前时间戳?

【问题讨论】:

  • 在您的迁移$table->timestamp('called_at) 中添加->nullable() 然后重新迁移。或者进入数据库并简单地允许该字段为空。
  • 我已经在架构中将其设置为 nullable()。
  • 注册了吗?
  • 我在问题中提到了这一点:“我有一个名为 called_at 的自定义日期字段,我在架构中将其设置为可为空”

标签: php laravel eloquent


【解决方案1】:

尝试这样做:

public function setCalledAtAttribute($date)
{
    $this->attributes['called_at'] = empty($date) ? null : Carbon::parse($date);
}

【讨论】:

  • 它工作正常。但我有个问题。为什么即使表单中没有插入任何内容,它也会将日期字段设置为当前时间戳?
  • @Eisenheim 将日期定义为->dateTime() 而不是->timestamp()
  • 如果我将其定义为 dateTime(),我可以从表单中取空值吗?
  • 即使我将其保留为 timestamp 并且不将其设置为 dateTime,您的代码仍然有效(设置为 null 而不是当前日期)。
  • @Eisenheim 请注意,无论何时创建或更新记录,时间戳字段都会自动更新。如果您不想要这种行为,请将其更改为日期时间字段。
【解决方案2】:

如果你对空字符串 Carbon::parse('') 或 null Carbon::parse(null) 使用解析,Carbon 实际上将 return 当前日期和时间所以你应该检查是否提供了 $date 而不是 null:

$this->attributes['called_at'] = $date ? Carbon::parse($date); : null; 

【讨论】:

  • 感谢您明确问题。 Laravel 应该在他们的文档中添加了这个。不是每个人都有关于碳的先验知识:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 2018-07-08
  • 2017-10-22
相关资源
最近更新 更多