1. 程式人生 > >laravel中的ORM模型修改created_at,updated_at,deleted_at三個時間欄位型別

laravel中的ORM模型修改created_at,updated_at,deleted_at三個時間欄位型別

laravel框架中的ORM模型極大的簡化了資料庫操作,同時也提高了資料操作安全性。

在laravel框架ORM模型中預設會有三個時間欄位,created_at,updated_at,deleted_at,這三個時間欄位是框架預設操作,不用另加程式碼去處理,非賞方便:

如: UserModel::create($insert); ORM模型會自動新增上create_at欄位但寫入當前時間,而不用我們自己去新增這個欄位,在修改時會加上updated_at,

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

正常刪除會直接刪除資料庫裡的記錄,同樣我們也不用為表建立deleted_at欄位,

當使用軟刪除時,框架不會直接刪除資料庫裡的資料,而是直接寫deleted_at指定當前刪除時間。

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

ORM在開發中方便了資料操作,只是在laravel框架中預設的ORM模型這三個時間欄位的資料型別是datetime型,而且在軟刪除模式中deleted_at必須允許為NULL,更要命的是如果我們修改了欄位型別為int型時deleted_at欄位也必須允許為NULL,否則軟刪除會出現無法正常取資料,因為在使用軟刪除時框架預設新增的條件是deleted_at is NULL為正常資料,在一些資料量大的表中一般時間欄位會使用int型,而如果允許為NULL則會影響索引的命中。

具體的修改有:

/**
  * 指定時間字元
  *
  * @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 中的幾個方法,並且擴充套件IlluminateDatabaseEloquentSoftDeletingScope類

程式碼如下:

trait SoftDelete{
    use SoftDeletingTrait;
    /**
  * 建立軟刪除物件
  *
  * @return void
  */
 public static function bootSoftDeletingTrait()
 {
  static::addGlobalScope(new SoftDeleteScope);
 }
    /**
  * 只獲取軟刪除的記錄
  *
  * @return IlluminateDatabaseEloquentBuilder|static
  */
 public static function onlyTrashed()
 {
  $instance = new static;

  $column = $instance->getQualifiedDeletedAtColumn();

  return $instance->newQueryWithoutScope(new SoftDeleteScope)->where($column,'>',new IlluminateDatabaseQueryExpression('0'));
 }
    /**
  * 獲取軟刪除與正常一起的記錄
  *
  * @return IlluminateDatabaseEloquentBuilder|static
  */
 public static function withTrashed()
 {
  return with(new static)->newQueryWithoutScope(new SoftDeleteScope);
 }
}

class SoftDeleteScope extends IlluminateDatabaseEloquentSoftDeletingScope{
    /**
  * 只獲取正常資料
  *
  * @param  IlluminateDatabaseEloquentBuilder  $builder
  * @return void
  */
 public function apply(IlluminateDatabaseEloquentBuilder $builder)
 {
  $model = $builder->getModel();

  $builder->where($model->getQualifiedDeletedAtColumn(),'=',new IlluminateDatabaseQueryExpression('0'));

  $this->extend($builder);
 }
    /**
  * 只獲取軟刪除資料
  *
  * @param  IlluminateDatabaseEloquentBuilder  $builder
  * @return void
  */
 protected function addOnlyTrashed(IlluminateDatabaseEloquentBuilder $builder)
 {
  $builder->macro('onlyTrashed', function(IlluminateDatabaseEloquentBuilder $builder)
  {
   $this->remove($builder);

   $builder->getQuery()->where($builder->getModel()->getQualifiedDeletedAtColumn(),'>',new IlluminateDatabaseQueryExpression('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型別的時間欄位

本文出自 “秋風掃落葉” 部落格,請務必保留此出處http://php2012web.blog.51cto.com/5585213/1536854