【问题标题】:laravel 5 , how to handle created_at automatically but not the updated_atlaravel 5,如何自动处理 created_at 而不是 updated_at
【发布时间】:2015-07-05 21:03:23
【问题描述】:

正如 laravel 的文档中所说,eloquent 可以处理 created_at 和 updated_at 字段,如果我希望 laravel 只处理 created_at,而留下 updated_at 呢?

【问题讨论】:

    标签: laravel eloquent laravel-5


    【解决方案1】:

    实现上述方法的一种方法是更改​​模型事件。将以下方法添加到您的模型中。

    public static function boot()
    {
        public $timestamps = false;
        parent::boot();
    
        static::creating(function($model) {
            $dateTime = new DateTime;
            $model->created_at = $dateTime->format('m-d-y H:i:s');
            return true;
        });
    
        static::updating(function($model) {
            $dateTime = new DateTime;
            $model->updated_at = $dateTime->format('m-d-y H:i:s');
            return true;
        });
    }
    

    现在您可以访问创建和更新模型事件。在这些事件中,您可以做任何您想做的事情,在您的情况下,您可以更改时间戳。有关模型事件的更多信息,请参阅 Laravel 文档Model Events

    【讨论】:

      【解决方案2】:

      Eloquent 处理updateTimestamps() 中的时间戳:

      protected function updateTimestamps()
      {
          $time = $this->freshTimestamp();
      
          if ( ! $this->isDirty(static::UPDATED_AT))
          {
              $this->setUpdatedAt($time);
          }
      
          if ( ! $this->exists && ! $this->isDirty(static::CREATED_AT))
          {
              $this->setCreatedAt($time);
          }
      }
      

      您可以简单地在模型中覆盖此函数并删除 updatedAt 部分:

      protected function updateTimestamps()
      {
          $time = $this->freshTimestamp();
      
          if ( ! $this->exists && ! $this->isDirty(static::CREATED_AT))
          {
              $this->setCreatedAt($time);
          }
      }
      

      或者您可以直接覆盖 setUpdatedAt,尽管您可能希望保留它以有意设置值:

      public function setUpdatedAt($value)
      {
          // do nothing
      }
      

      【讨论】:

        【解决方案3】:

        开箱即用功能的全部或全部。

        仅复制 created_at 的功能,您可以使用 eloquent 事件。对于您的每个模型,您可以执行以下操作

        class MyModel extends Eloquent
        {
        
            protected $timestamps = false;
        
            public static function boot()
            {
                parent::boot();
        
                static::creating(function($model)
                {
                    $model->created_at = Carbon::now();
                });
            }
        
        }
        

        每次创建新模型时,都会使用 Carbon 将 created_at 列设置为当前时间。

        【讨论】:

          猜你喜欢
          • 2018-09-16
          • 2017-05-26
          • 2016-08-28
          • 2016-04-05
          • 1970-01-01
          • 2011-06-11
          • 1970-01-01
          • 2013-06-23
          • 2015-09-16
          相关资源
          最近更新 更多