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類型的時間字段