Yii CActiveRecord 逻辑删除封装
<?php
class BaseModel extends CActiveRecord
{
/**
* Set id,cretate_time,update_time value before save this model
*/
protected function beforeSave()
{
if($this->isNewRecord)
{
if($this->hasAttribute("id"))
{
$this->id = StringUtil::uuid();
}
if($this->hasAttribute("creator") && empty($this->creator))
{
$this->creator = Yii::app()->user->id;
}
if($this->hasAttribute("create_time"))
{
$this->create_time = new CDbExpression("NOW()");
}
}
if($this->hasAttribute("updated_time"))
{
$this->updated_time = new CDbExpression("NOW()");
}
return parent::beforeSave();
}
/**
* check the value is true or false
* @param $value The need checked value
*/
public function checkTruthy($value)
{
$truthy = (bool)$value;
if("string" == gettype($value))
{
if ("true" != $value && "1" != $value)
{
$truthy = false;
}
}
return $truthy;
}
/**
* logic delete, set is delete cloum true if has
* @see CActiveRecord::deleteByPK()
*/
public function deleteByPK($pk,$condition="",$params=array())
{
Yii::trace(get_class($this).".deleteByPk()","system.model.CActiveRecord");
if($this->hasAttribute("is_delete"))
{
return $this->updateByPk($pk, array("is_delete" => Constant::DELETED), $condition, $params);
}
else
{
return parent::deleteByPK($pk, $condition, $params);
}
}
/**
* logic delete, set is delete cloum true if has
* @see CActiveRecord::deleteAll()
*/
public function deleteAll($condition="",$params=array())
{
Yii::trace(get_class($this).".deleteAll()","system.model.BaseModel");
if($this->hasAttribute("is_delete"))
{
return $this->updateAll(array("is_delete" => Constant::DELETED), $condition, $params);
}
else
{
return parent::deleteAll($condition, $params);
}
}
/**
* logic delete, set is delete cloum true if has
* @see CActiveRecord::deleteAllByAttributes()
*/
public function deleteAllByAttributes($attributes,$condition="",$params=array())
{
Yii::trace(get_class($this).".deleteAllByAttributes()","system.model.BaseModel");
if($this->hasAttribute("is_delete"))
{
$builder=$this->getCommandBuilder();
$criteria=$builder->createCriteria($condition,$params);
if(is_array($attributes))
{
$columnCriteria = new CDbCriteria();
foreach ($attributes as $key => $value)
{
if($this->hasAttribute($key))
{
$columnCriteria->compare($key, $value);
}
}
$criteria->mergeWith($columnCriteria);
}
return $this->updateAll(array("is_delete" => Constant::DELETED), $criteria);
}
else
{
return parent::deleteAllByAttributes($attributes, $condition, $params);
}
}
/**
* filter deleted
* @see CActiveRecord::query()
*/
protected function query($criteria,$all=false)
{
if($this->hasAttribute("is_delete"))
{
$criteria->compare($this->getTableAlias() . ".is_delete", Constant::NOT_DELETED);
}
return parent::query($criteria,$all);
}
/**
* filter deleted
* @see CActiveRecord::count()
*/
public function count($condition="",$params=array())
{
Yii::trace(get_class($this).".count()","app.model.BaseModel");
$builder=$this->getCommandBuilder();
$criteria=$builder->createCriteria($condition,$params);
if($this->hasAttribute("is_delete"))
{
$criteria->compare($this->getTableAlias() . ".is_delete", Constant::NOT_DELETED);
}
$this->applyScopes($criteria);
if(empty($criteria->with))
return $builder->createCountCommand($this->getTableSchema(),$criteria)->queryScalar();
else
{
$finder=new CActiveFinder($this,$criteria->with);
return $finder->count($criteria);
}
}
/**
* filter deleted
* @see CActiveRecord::countByAttributes()
*/
public function countByAttributes($attributes,$condition="",$params=array())
{
Yii::trace(get_class($this).".countByAttributes()","app.model.BaseModel");
$prefix=$this->getTableAlias(true).".";
$builder=$this->getCommandBuilder();
$criteria=$builder->createColumnCriteria($this->getTableSchema(),$attributes,$condition,$params,$prefix);
if($this->hasAttribute("is_delete"))
{
$criteria->compare($this->getTableAlias() . ".is_delete", Constant::NOT_DELETED);
}
$this->applyScopes($criteria);
if(empty($criteria->with))
return $builder->createCountCommand($this->getTableSchema(),$criteria)->queryScalar();
else
{
$finder=new CActiveFinder($this,$criteria->with);
return $finder->count($criteria);
}
}
/**
* remove attributes from record model
*/
public function uselessFields()
{
return array("is_delete");
}
/**
* romeve useless fileds when CJSON::encode.
*/
public function getIterator()
{
$attributes=$this->getAttributes();
$uselessFields = $this->uselessFields();
foreach($uselessFields as $field)
{
if(isset($attributes[$field]))
{
unset($attributes[$field]);
}
}
return new CMapIterator($attributes);
}
}封装方法时需要先看一下Yii中的有关源码,有的只需要要在源码的基础上添加上自己的条件即可,如count等,只是添加了is_delete条件的判断
转载自:http://blog.csdn.net/f0225/article/details/19079155
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: yii CActiveRecord 查询
- 下一篇: YII框架获取对象数组为普通数组方法
