首页 > 解决方案 > laravel 5.7 如何将日期时间字段更新为空

问题描述

■ Laravel:5.7

■ PHP:7.2

我需要将模型DateTime Field 更新为 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();
}

标签: phplaravellaravel-5eloquent

解决方案


回到当天的原因是:

当您的财产评估员为一个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;
}

此外,jobStart$casts属性中删除。否则,您会得到与转换为当前日期的null值相同的行为。jobStart

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


推荐阅读