【问题标题】:laravel 5.7 how to update datetime field to nulllaravel 5.7 如何将日期时间字段更新为空
【发布时间】:2019-08-30 02:46:30
【问题描述】:

■ Laravel:5.7

■ PHP:7.2

我需要将模型DateTime字段更新为null,但我不知道为什么当我输入null时会将Field更新为当前日期时间。

当我将表单 job_startjob_end 设置为空白时,会将字段更新为当前日期时间。

另外,我已经尝试过$job->job_start = null; $job->save();,但得到了相同的结果。

 class Job extends Model {

     /**
     * @var $casts(toArray、toJson)
     */
     protected $casts = [
        'visit_date' => 'date:Y-m-d',
        'job_start' => 'datetime:Y-m-d H:i',
        'job_end' => 'datetime:Y-m-d H:i',
     ];

     /**
      * @var date 
     */
     protected $dates = [
        'visit_date', 
        'job_start',
        'job_end',
     ];

     // $fillable(save、update、fill)
     protected $fillable = [
        /**SKIP**/
        'visit_date', 
        'job_start',
        'job_end',
        /**SKIP**/
     ];

     /**SKIP other function**/

     /**
      * job_start
      * @param  string  $value ($value format 'Y:m:d H:i')
      * @return void
      */
     public function setJobStartAttribute($value) {
        if($value !== null){
            //$value format 'Y:m:d H:i' to 'Y-m-d H:i:s'
            $value = (new Carbon($value))->format('Y-m-d H:i:s');
        }
        //set
        $this->attributes['job_start'] = $value;
     }

     /**
      * job_start
      * @param  string  $value ($value format 'Y:m:d H:i:s')
      * @return void
      */
     public function getJobStartAttribute($value) {
        //$value format 'Y:m:d H:i:s' to 'Y-m-d H:i'
        return (new Carbon($value))->format('Y-m-d H:i');
     }
 }

相关迁移设置:

Schema::create('jobs', function(Blueprint $table) {
  /**Relate Migration setting**/
  $table->dateTime('job_start')->nullable();
  $table->dateTime('job_end')->nullable();
});

已经尝试了:

public function update($id, Request $request) {
  $job = Job::findOrFail($id);
  $job->fill( $request->input() );
  //test set job_start null as below,
  //but I don't know why when I input to null will update Field to current date time.
  $job->job_start = null;
  $job->save();
}

【问题讨论】:

  • 您的日期时间是否可以为空?
  • 'job_start' => 'datetime:Y-m-d H:i', 会将 null 转换为 '1970-01-01 00:00:00'
  • 检查你的迁移,也许它已经定义了一个默认值。
  • Schema::create('jobs', function(Blueprint $table) { /**相关迁移设置**/ $table->dateTime('job_start')->nullable(); $ table->dateTime('job_end')->nullable(); });
  • 如果您不想设置当前日期,setJobStartAttribute 方法可能不应该存在

标签: php laravel laravel-5 eloquent


【解决方案1】:

返回当天的原因是:

当您的资产评估员为 null 值执行操作时,它的计算结果为 new Carbon(null),相当于 Carbon::now()

public function getJobStartAttribute($value) {
        //$value format 'Y:m:d H:i:s' to 'Y-m-d H:i'
    return (new Carbon($value))->format('Y-m-d H:i');
}

您可以通过编写来修复该路径

public function getJobStartAttribute($value) {
    if ($value !== null) {
        //$value format 'Y:m:d H:i:s' to 'Y-m-d H:i'
       return (new Carbon($value))->format('Y-m-d H:i');
    }
    return $value;
}

另外,从$casts 属性中删除jobStart。否则,将jobStartnull 值强制转换为当前日期会得到相同的行为。

删除它的另一个原因是评估员已经格式化了日期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多