57754


**実行環境**  
■ Laravel : 5.7  
■ PHP : 7.2

**実現したいこと:**  
モデルDateTime型のNULL更新したいのですが、やり方よくわかりません。

**発生している問題・エラーメッセージ**  
formのinputに空に変更で更新する時に、  
何故か現在時刻に自動更新している。

**該当のソースコード**  
現在のモデルの内容

[code]

    /?php
    namespace /**省略**/
    class Job extends Model {
    
        /**
         * @var キャスト （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 = [
            /**省略**/
            'visit_date', 
            'job_start',
            'job_end',
            /**省略**/
        ];
    
        /**他のFUNCTIONは無関係なので省略**/
    
        /**
         *　ミューテター
         *　job_start の　設定
         * @param  string  $value ($valueのフォーマットは 'Y:m:d H:i')
         * @return void
         */
        public function setJobStartAttribute($value) {
            if($value !== null){
                //$valueのフォーマットは 'Y:m:d H:i'
                //Carbon で正常のフォーマットに変更する？
                $value = (new Carbon($value))->format('Y-m-d H:i:s');
            }
            //null ならそのまま？
            $this->attributes['job_start'] = $value;
        }
    
        /**
         *　ミューテター
         *　job_start の　取得
         * @param  string  $value ($valueのフォーマットは 'Y:m:d H:i')
         * @return void
         */
        public function getJobStartAttribute($value) {
            return (new Carbon($value))->format('Y-m-d H:i');
        }
    
    }
    
[/code]

**関連のマイグレーション**

[code]

    Schema::create('jobs', function(Blueprint $table)
    {
    /**省略**/
    $table->dateTime('job_start')->nullable();
    $table->dateTime('job_end')->nullable();
    });
    
[/code]

* * *

試したこと1

[code]

    public function edit($id, Request $request){
     $job = Job::findOrFail($id);
     $job->job_start = null;
     $job->save();
    }
    
[/code]

試したこと2

[code]

    public function update($id, Request $request){
     $job = Job::findOrFail($id);
     //input内容のjob_startは空です
     $job->fill( $request->input() );
     $job->save();
    }
    
[/code]

両方とも何故かjob_startが現在時刻に更新しています。

同じ質問をteratailにも投稿しています。  
<https://teratail.com/questions/209084>


CC BY-SA 4.0
2019-08-30T04:48:03.093
57716
2019-09-02T01:33:29.270
2019-08-30T05:03:30.507
3060
34577
question
php laravel laravel-5
DateTime型のNULL更新について


<https://teratail.com/questions/209084>  
で解決しました。

多分、laravelのsave時には、getJobStartAttributeを通しています。  
以下の通りに変更したら、解決しました。

[code]

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


CC BY-SA 4.0
2019-09-02T01:33:29.270
57754
2019-09-02T01:33:29.270
34577
57716
answer