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