laravel中的ORM模型修改created_at,updated_at,deleted_at三個時間字段類型

laravel框架中的ORM模型極大的簡化了數據庫操做,同時也提升了數據操做安全性。laravel

在laravel框架ORM模型中默認會有三個時間字段,created_at,updated_at,deleted_at,這三個時間字段是框架默認操做,不用另加代碼去處理,非賞方便:數據庫

如: UserModel::create($insert); ORM模型會自動添加上create_at字段但寫入當前時間,而不用咱們本身去添加這個字段,在修改時會加上updated_at,安全

在刪除時laravel框架提供兩種模式,一個是正常刪除,一個是軟刪除,app

正常刪除會直接刪除數據庫裏的記錄,一樣咱們也不用爲表建立deleted_at字段,框架

當使用軟刪除時,框架不會直接刪除數據庫裏的數據,而是直接寫deleted_at指定當前刪除時間。ide

注意:當laravel使用了軟刪除,在每次正常查詢時都會添加一個deleted_at is null 的條件,以去掉刪除的記錄,當前要取出刪除的記錄則要 UserModel::onlyTrashed()->get();ui

 

ORM在開發中方便了數據操做,只是在laravel框架中默認的ORM模型這三個時間字段的數據類型是datetime型,並且在軟刪除模式中deleted_at必須容許爲NULL,更要命的是若是咱們修改了字段類型爲int型時deleted_at字段也必須容許爲NULL,不然軟刪除會出現沒法正常取數據,由於在使用軟刪除時框架默認添加的條件是deleted_at is NULL爲正常數據,在一些數據量大的表中通常時間字段會使用int型,而若是容許爲NULL則會影響索引的命中。this

具體的修改有:spa

 

/**
  * 指定時間字符
  *
  * @param  \DateTime|int  $value
  * @return string
  */
    public function fromDateTime($value)
    {
        return strtotime(parent::fromDateTime($value));
    }對象

以上代碼是修改字段寫入數據庫的數據類型爲int

 

若是這個時候咱們想修改這三個字段的名稱能夠在對應的MODEL類中添加如下代碼

const DELETED_AT='delete_at';
const UPDATED_AT='update_at';
const CREATED_AT = 'create_at';

 

以上處理只能是在沒有使用軟刪除時正常工做,若是使用了軟刪除則必須重寫 SoftDeletingTrait 中的幾個方法,而且擴展Illuminate\Database\Eloquent\SoftDeletingScope類

代碼以下:

 

trait SoftDelete{
    use SoftDeletingTrait;
    /**
  * 建立軟刪除對象
  *
  * @return void
  */
 public static function bootSoftDeletingTrait()
 {
  static::addGlobalScope(new SoftDeleteScope);
 }
    /**
  * 只獲取軟刪除的記錄
  *
  * @return \Illuminate\Database\Eloquent\Builder|static
  */
 public static function onlyTrashed()
 {
  $instance = new static;

  $column = $instance->getQualifiedDeletedAtColumn();

  return $instance->newQueryWithoutScope(new SoftDeleteScope)->where($column,'>',new Illuminate\Database\Query\Expression('0'));
 }
    /**
  * 獲取軟刪除與正常一塊兒的記錄
  *
  * @return \Illuminate\Database\Eloquent\Builder|static
  */
 public static function withTrashed()
 {
  return with(new static)->newQueryWithoutScope(new SoftDeleteScope);
 }
}

class SoftDeleteScope extends Illuminate\Database\Eloquent\SoftDeletingScope{
    /**
  * 只獲取正常數據
  *
  * @param  \Illuminate\Database\Eloquent\Builder  $builder
  * @return void
  */
 public function apply(Illuminate\Database\Eloquent\Builder $builder)
 {
  $model = $builder->getModel();

  $builder->where($model->getQualifiedDeletedAtColumn(),'=',new Illuminate\Database\Query\Expression('0'));

  $this->extend($builder);
 }
    /**
  * 只獲取軟刪除數據
  *
  * @param  \Illuminate\Database\Eloquent\Builder  $builder
  * @return void
  */
 protected function addOnlyTrashed(Illuminate\Database\Eloquent\Builder $builder)
 {
  $builder->macro('onlyTrashed', function(Illuminate\Database\Eloquent\Builder $builder)
  {
   $this->remove($builder);

   $builder->getQuery()->where($builder->getModel()->getQualifiedDeletedAtColumn(),'>',new Illuminate\Database\Query\Expression('0'));

   return $builder;
  });
 }
    /**
  * 去掉軟刪除條件
  *
  * @param  array   $where
  * @param  string  $column
  * @return bool
  */
 protected function isSoftDeleteConstraint(array $where, $column)
 {
  return $where['type'] == 'Basic' && $where['operator']=='=' && $where['value']=='0' && $where['column'] == $column;
 }
}

 

說明:

SoftDelete 是重寫 SoftDeletingTrait 中的部分方法,只要咱們建立的MODEL使用了 use SoftDelete;

就能把原來的deleted_at字段徹底修改成int類型,而且不容許爲null。

SoftDeleteScope類只是爲了修改在軟刪除時添加的deleted_at is null的條件。

 

到這裏只要咱們建立的MODEL繼承於Eloquent而且在類中添加use SoftDelete;重寫fromDateTime方法就可使用int類型的時間字段

 

固然也能夠在Eloquent與Model中間再添加一個類用於重寫fromDateTime方法,能夠實現全部的model都使用int類型的時間字段

相關文章
相關標籤/搜索