CActiveRecord
包 | system.db.ar |
---|---|
继承 | abstract class CActiveRecord » CModel » CComponent |
实现 | ArrayAccess, Traversable, IteratorAggregate |
源自 | 1.0 |
版本 | $Id: CActiveRecord.php 3533 2012-01-08 22:07:55Z mdomba $ |
源码 | framework/db/ar/CActiveRecord.php |
公共属性
属性 | 类型 | 描述 | 定义在 |
---|---|---|---|
attributes | array | 返回所有列的属性值。 | CActiveRecord |
commandBuilder | CDbCommandBuilder | 返回此AR的命令生成器。 | CActiveRecord |
db | CDbConnection | 所有活动记录类的默认数据库连接。 默认情况下,这是'db'应用程序组件, | CActiveRecord |
dbConnection | CDbConnection | 返回活动记录所使用的数据库连接。 | CActiveRecord |
dbCriteria | CDbCriteria | 返回和这个模型相关的查询条件。 | CActiveRecord |
errors | array | Returns the errors for all attribute or a single attribute. | CModel |
isNewRecord | boolean | 返回当前记录是否是新的。 | CActiveRecord |
iterator | CMapIterator | Returns an iterator for traversing the attributes in the model. | CModel |
metaData | CActiveRecordMetaData | 返回这个AR的元数据。 | CActiveRecord |
oldPrimaryKey | mixed | 返回旧的主键值。 | CActiveRecord |
primaryKey | mixed | 返回主键值。 | CActiveRecord |
safeAttributeNames | array | Returns the attribute names that are safe to be massively assigned. | CModel |
scenario | string | Returns the scenario that this model is used in. | CModel |
tableAlias | string | 返回由 find 方法使用表的别名。 | CActiveRecord |
tableSchema | CDbTableSchema | 返回表的元数据,这属于AR类。 | CActiveRecord |
validatorList | CList | Returns all the validators declared in the model. | CModel |
validators | array | Returns the validators applicable to the current scenario. | CModel |
公共方法
方法 | 描述 | 定义在 |
---|---|---|
__call() | 回调的命名方法。 | CActiveRecord |
__construct() | 构造函数。 | CActiveRecord |
__get() | PHP getter 魔术方法。 | CActiveRecord |
__isset() | 检测一个属性值是否为null。 | CActiveRecord |
__set() | PHP setter 魔术方法。 | CActiveRecord |
__sleep() | PHP sleep 魔术方法。 | CActiveRecord |
__unset() | 检查属性值是否为空。 | CActiveRecord |
addError() | Adds a new error to the specified attribute. | CModel |
addErrors() | Adds a list of errors. | CModel |
addRelatedRecord() | 不调用此方法。此方法用于内部CActiveFinder来填充相关的对象。 | CActiveRecord |
afterFindInternal() | 调用afterFind。 | CActiveRecord |
applyScopes() | 适用于给定条件的查询范围。 | CActiveRecord |
asa() | 返回这个名字的行为对象。 | CComponent |
attachBehavior() | 附加一个行为到组件。 | CComponent |
attachBehaviors() | 附加一个行为列表到组件。 | CComponent |
attachEventHandler() | 为事件附加一个事件处理程序。 | CComponent |
attributeLabels() | Returns the attribute labels. | CModel |
attributeNames() | 返回模型的所有属性名称的列表。 | CActiveRecord |
beforeFindInternal() | 调用beforeFind。 | CActiveRecord |
behaviors() | Returns a list of behaviors that this model should behave as. | CModel |
cache() | 设置关于查询缓存的参数. | CActiveRecord |
canGetProperty() | 确定属性是否可读。 | CComponent |
canSetProperty() | 确定属性是否可写。 | CComponent |
clearErrors() | Removes errors for all attributes or a single attribute. | CModel |
count() | 查找满足指定查询条件的行数。 | CActiveRecord |
countByAttributes() | 查找具有指定的属性值的行数。 | CActiveRecord |
countBySql() | 查找指定SQL语句影响的行数。 | CActiveRecord |
createValidators() | Creates validator objects based on the specification in rules. | CModel |
defaultScope() | 返回默认的命名范围,应隐含这种模式适用于所有查询。 | CActiveRecord |
delete() | 删除对应于此活动记录的行。 | CActiveRecord |
deleteAll() | 删除指定条件的行。 | CActiveRecord |
deleteAllByAttributes() | 删除指定的属性值相匹配的行。 | CActiveRecord |
deleteByPk() | 删除指定主键的行。 | CActiveRecord |
detachBehavior() | 从组件中分离一个行为。 | CComponent |
detachBehaviors() | 从组件中分离所有行为。 | CComponent |
detachEventHandler() | 分离一个存在的事件处理程序。 | CComponent |
disableBehavior() | 禁用一个附加行为。 | CComponent |
disableBehaviors() | 禁用组件附加的所有行为。 | CComponent |
enableBehavior() | 启用一个附加行为。 | CComponent |
enableBehaviors() | 启用组件附加的所有行为。 | CComponent |
equals() | 当前活动记录与另一个比较。 | CActiveRecord |
evaluateExpression() | 计算一个PHP表达式,或根据组件上下文执行回调。 | CComponent |
exists() | 检查是否满足指定条件的行。 | CActiveRecord |
find() | 查找指定条件的单个活动记录。 | CActiveRecord |
findAll() | 查找满足指定条件的所有活动记录。 | CActiveRecord |
findAllByAttributes() | 查找具有指定属性值的所有活动记录。 | CActiveRecord |
findAllByPk() | 查找指定主键的所有活动记录。 | CActiveRecord |
findAllBySql() | 查找指定SQL语句的所有活动记录。 | CActiveRecord |
findByAttributes() | 查找具有指定属性值的单个活动记录。 | CActiveRecord |
findByPk() | 查找指定主键的单一活动记录。 | CActiveRecord |
findBySql() | 查找指定SQL语句的单个活动记录。 | CActiveRecord |
generateAttributeLabel() | Generates a user friendly attribute label. | CModel |
getActiveRelation() | 返回此AR类声明的命名关系。 | CActiveRecord |
getAttribute() | 返回命名的属性值。 | CActiveRecord |
getAttributeLabel() | 返回指定属性的文本标签。 | CActiveRecord |
getAttributes() | 返回所有列的属性值。 | CActiveRecord |
getCommandBuilder() | 返回此AR的命令生成器。 | CActiveRecord |
getDbConnection() | 返回活动记录所使用的数据库连接。 | CActiveRecord |
getDbCriteria() | 返回和这个模型相关的查询条件。 | CActiveRecord |
getError() | Returns the first error of the specified attribute. | CModel |
getErrors() | Returns the errors for all attribute or a single attribute. | CModel |
getEventHandlers() | 返回一个事件的附加处理程序列表。 | CComponent |
getIsNewRecord() | 返回当前记录是否是新的。 | CActiveRecord |
getIterator() | Returns an iterator for traversing the attributes in the model. | CModel |
getMetaData() | 返回这个AR的元数据。 | CActiveRecord |
getOldPrimaryKey() | 返回旧的主键值。 | CActiveRecord |
getPrimaryKey() | 返回主键值。 | CActiveRecord |
getRelated() | 返回相关的记录。 | CActiveRecord |
getSafeAttributeNames() | Returns the attribute names that are safe to be massively assigned. | CModel |
getScenario() | Returns the scenario that this model is used in. | CModel |
getTableAlias() | 返回由 find 方法使用表的别名。 | CActiveRecord |
getTableSchema() | 返回表的元数据,这属于AR类。 | CActiveRecord |
getValidatorList() | Returns all the validators declared in the model. | CModel |
getValidators() | Returns the validators applicable to the current scenario. | CModel |
hasAttribute() | 检查此AR是否有命名的属性。 | CActiveRecord |
hasErrors() | Returns a value indicating whether there is any validation error. | CModel |
hasEvent() | 确定一个事件是否定义。 | CComponent |
hasEventHandler() | 检查事件是否有附加的处理程序。 | CComponent |
hasProperty() | 确定属性是否被定义。 | CComponent |
hasRelated() | 返回一个值,该值指示是否已加载命名的相关对象。 | CActiveRecord |
init() | 初始化这个模型。 | CActiveRecord |
insert() | 插入一行到基于这个ActiveRecord的属性表。 | CActiveRecord |
isAttributeRequired() | Returns a value indicating whether the attribute is required. | CModel |
isAttributeSafe() | Returns a value indicating whether the attribute is safe for massive assignments. | CModel |
model() | 返回指定AR类的静态模型。 | CActiveRecord |
offsetExists() | 返回是否有指定偏移量的元素。 | CActiveRecord |
offsetGet() | Returns the element at the specified offset. | CModel |
offsetSet() | Sets the element at the specified offset. | CModel |
offsetUnset() | Unsets the element at the specified offset. | CModel |
onAfterConstruct() | This event is raised after the model instance is created by new operator. | CModel |
onAfterDelete() | 在删除记录之后,将引发此事件。 | CActiveRecord |
onAfterFind() | 引发此事件记录后找到方法的实例。 | CActiveRecord |
onAfterSave() | 保存记录之后,将引发此事件。 | CActiveRecord |
onAfterValidate() | This event is raised after the validation is performed. | CModel |
onBeforeDelete() | 在删除记录之前,将引发此事件。 | CActiveRecord |
onBeforeFind() | AR finder执行查找调用之前,将引发此事件。 | CActiveRecord |
onBeforeSave() | 保存记录之前,将引发此事件。 | CActiveRecord |
onBeforeValidate() | This event is raised before the validation is performed. | CModel |
onUnsafeAttribute() | This method is invoked when an unsafe attribute is being massively assigned. | CModel |
populateRecord() | 给指定的属性创建活动记录 | CActiveRecord |
populateRecords() | 创建基于输入数据的活动记录的列表。 | CActiveRecord |
primaryKey() | 返回相关数据库表的主键。 | CActiveRecord |
raiseEvent() | 发起一个事件。 | CComponent |
refresh() | 最新的数据将被填充到这个活动记录。 | CActiveRecord |
refreshMetaData() | 刷新这个AR类的元数据。 | CActiveRecord |
relations() | 申明关系的对象,应重写此方法。 | CActiveRecord |
resetScope() | 重置所有变量作用域,包括默认的范围。 | CActiveRecord |
rules() | Returns the validation rules for attributes. | CModel |
save() | 保存当前的记录。 | CActiveRecord |
saveAttributes() | 保存所选的属性列表。 | CActiveRecord |
saveCounters() | 保存一个或多当前AR对象到计数器。 | CActiveRecord |
scopes() | 返回申明的命名范围。 | CActiveRecord |
setAttribute() | 设置命名的属性值。 | CActiveRecord |
setAttributes() | Sets the attribute values in a massive way. | CModel |
setDbCriteria() | 为当前模型设置查询条件. | CActiveRecord |
setIsNewRecord() | 设置记录是否是新的。 | CActiveRecord |
setOldPrimaryKey() | 设置旧的主键值。 | CActiveRecord |
setPrimaryKey() | 设置主键值。 | CActiveRecord |
setScenario() | Sets the scenario for the model. | CModel |
setTableAlias() | 设置表在查询中使用的别名。 | CActiveRecord |
tableName() | 返回关联的数据库表的名称。 | CActiveRecord |
together() | 设置CDbCriteria::together属性为true。 | CActiveRecord |
unsetAttributes() | Sets the attributes to be null. | CModel |
update() | 更新此活动记录所表示的行。 | CActiveRecord |
updateAll() | 更新使用指定条件的记录。 | CActiveRecord |
updateByPk() | 更新指定主键记录的行。 | CActiveRecord |
updateCounters() | 更新的一个或多个计数器。 | CActiveRecord |
validate() | Performs the validation. | CModel |
with() | 指定相关对象应一起载入。 | CActiveRecord |
受保护方法
方法 | 描述 | 定义在 |
---|---|---|
afterConstruct() | This method is invoked after a model instance is created by new operator. | CModel |
afterDelete() | 删除记录之后调用此方法。 | CActiveRecord |
afterFind() | 每个记录由 find 方法实例化后,将调用此方法。 | CActiveRecord |
afterSave() | 记录被成功保存后,调用此方法。 | CActiveRecord |
afterValidate() | This method is invoked after validation ends. | CModel |
beforeDelete() | 在删除记录之前调用此方法。 | CActiveRecord |
beforeFind() | AR finder执行查找调用之前,将引发此事件。 | CActiveRecord |
beforeSave() | 保存记录之前,调用这个方法(验证后,如果有的话)。 | CActiveRecord |
beforeValidate() | This method is invoked before validation starts. | CModel |
instantiate() | 创建活动记录实例。 | CActiveRecord |
query() | 执行实际的数据库查询和填充AR对象的查询结果。 | CActiveRecord |
事件
事件 | 描述 | 定义在 |
---|---|---|
onBeforeSave | 保存记录之前,将引发此事件。 | CActiveRecord |
onAfterSave | 保存记录之后,将引发此事件。 | CActiveRecord |
onBeforeDelete | 在删除记录之前,将引发此事件。 | CActiveRecord |
onAfterDelete | 在删除记录之后,将引发此事件。 | CActiveRecord |
onBeforeFind | AR finder执行查找调用之前,将引发此事件。 | CActiveRecord |
onAfterFind | 引发此事件记录后找到方法的实例。 | CActiveRecord |
onAfterConstruct | This event is raised after the model instance is created by new operator. | CModel |
onBeforeValidate | This event is raised before the validation is performed. | CModel |
onAfterValidate | This event is raised after the validation is performed. | CModel |
onUnsafeAttribute | This method is invoked when an unsafe attribute is being massively assigned. | CModel |
属性详细
public void setAttributes(array $values, boolean $safeOnly=true)
返回所有列的属性值。 注意,不返回相关的对象。
返回此AR的命令生成器。
所有活动记录类的默认数据库连接。 默认情况下,这是'db'应用程序组件,
返回活动记录所使用的数据库连接。 默认情况下,"db"应用程序组件用作数据库连接。 如果您要使用一个不同的数据库连接,您可以重写此方法。
public void setDbCriteria(CDbCriteria $criteria)
返回和这个模型相关的查询条件。
返回当前记录是否是新的。
返回这个AR的元数据。
返回旧的主键值。 这指的是主键值已填充到记录后, 执行查找方法 (例如: find(),findAll()), 即使主关键属性都会被手动分配一个不同的值,值保持不变。
返回主键值。
public void setTableAlias(string $alias)
返回由 find 方法使用表的别名。 在关系查询,根据对应关系的声明, 返回的表的别名可能会有所不同。 此外,由setTableAlias可以由应用的范围覆盖。
返回表的元数据,这属于AR类。
方法详细
public mixed __call(string $name, array $parameters)
| ||
$name | string | 方法名 |
$parameters | array | 方法参数 |
{return} | mixed | 此方法返回值 |
public function __call($name,$parameters)
{
if(isset($this->getMetaData()->relations[$name]))
{
if(empty($parameters))
return $this->getRelated($name,false);
else
return $this->getRelated($name,false,$parameters[0]);
}
$scopes=$this->scopes();
if(isset($scopes[$name]))
{
$this->getDbCriteria()->mergeWith($scopes[$name]);
return $this;
}
return parent::__call($name,$parameters);
}
回调的命名方法。 请不要调用它,它不是类的方法。 这是我们重写一个PHP魔术方法实现了这个命名范围的功能。
public void __construct(string $scenario='insert')
| ||
$scenario | string | 场景名。参见CModel::scenario关于这个参数的更多信息。 |
public function __construct($scenario='insert')
{
if($scenario===null) // internally used by populateRecord() and model()
return;
$this->setScenario($scenario);
$this->setIsNewRecord(true);
$this->_attributes=$this->getMetaData()->attributeDefaults;
$this->init();
$this->attachBehaviors($this->behaviors());
$this->afterConstruct();
}
构造函数。
public mixed __get(string $name)
| ||
$name | string | 属性名 |
{return} | mixed | 属性值 |
public function __get($name)
{
if(isset($this->_attributes[$name]))
return $this->_attributes[$name];
else if(isset($this->getMetaData()->columns[$name]))
return null;
else if(isset($this->_related[$name]))
return $this->_related[$name];
else if(isset($this->getMetaData()->relations[$name]))
return $this->getRelated($name);
else
return parent::__get($name);
}
PHP getter 魔术方法。 重写此方法,以便AR属性能像属性那样访问。
参见
public boolean __isset(string $name)
| ||
$name | string | 属性名或事件名 |
{return} | boolean | 是否属性值为null |
public function __isset($name)
{
if(isset($this->_attributes[$name]))
return true;
else if(isset($this->getMetaData()->columns[$name]))
return false;
else if(isset($this->_related[$name]))
return true;
else if(isset($this->getMetaData()->relations[$name]))
return $this->getRelated($name)!==null;
else
return parent::__isset($name);
}
检测一个属性值是否为null。 通过检测,如果命令属性为空或不存在, 此方法重写父类。
public void __set(string $name, mixed $value)
| ||
$name | string | 属性名 |
$value | mixed | 属性值 |
public function __set($name,$value)
{
if($this->setAttribute($name,$value)===false)
{
if(isset($this->getMetaData()->relations[$name]))
$this->_related[$name]=$value;
else
parent::__set($name,$value);
}
}
PHP setter 魔术方法。 重写此方法,以便AR属性能像属性那样访问。
public array __sleep()
| ||
{return} | array |
public function __sleep()
{
$this->_md=null;
return array_keys((array)$this);
}
PHP sleep 魔术方法。 此方法确保模型元数据引用被设置为 null。
public void __unset(string $name)
| ||
$name | string | 属性名或事件名 |
public function __unset($name)
{
if(isset($this->getMetaData()->columns[$name]))
unset($this->_attributes[$name]);
else if(isset($this->getMetaData()->relations[$name]))
unset($this->_related[$name]);
else
parent::__unset($name);
}
检查属性值是否为空。 通过检测,如果命令属性为空或不存在, 此方法重写父类。
public void addRelatedRecord(string $name, mixed $record, mixed $index)
| ||
$name | string | 属性名称 |
$record | mixed | 相关的记录 |
$index | mixed | 相关对象集合中的索引值。 如果true,这意味着使用从零开始的整数索引。 如果false,它意味着HAS_ONE或BELONGS_TO对象和索引不需要。 |
public function addRelatedRecord($name,$record,$index)
{
if($index!==false)
{
if(!isset($this->_related[$name]))
$this->_related[$name]=array();
if($record instanceof CActiveRecord)
{
if($index===true)
$this->_related[$name][]=$record;
else
$this->_related[$name][$index]=$record;
}
}
else if(!isset($this->_related[$name]))
$this->_related[$name]=$record;
}
不调用此方法。此方法用于内部CActiveFinder来填充相关的对象。 此方法添加到此记录的相关的对象。
protected void afterDelete()
|
protected function afterDelete()
{
if($this->hasEventHandler('onAfterDelete'))
$this->onAfterDelete(new CEvent($this));
}
删除记录之后调用此方法。 这个默认执行引发onAfterDelete事件。 您可以重写此方法,在记录被删除后做处理。 请确保您调用父实例,以便正确地引发该事件。
protected void afterFind()
|
protected function afterFind()
{
if($this->hasEventHandler('onAfterFind'))
$this->onAfterFind(new CEvent($this));
}
每个记录由 find 方法实例化后,将调用此方法。 这个默认执行引发onAfterFind事件。 你可以重写这个方法, 做处理后每个新查找的记录实例。 请确保您调用父实例,以便正确地引发该事件。
public void afterFindInternal()
|
public function afterFindInternal()
{
$this->afterFind();
}
调用afterFind。 这个方法内部使用。
protected void afterSave()
|
protected function afterSave()
{
if($this->hasEventHandler('onAfterSave'))
$this->onAfterSave(new CEvent($this));
}
记录被成功保存后,调用此方法。 这个默认执行引发onAfterSave事件。 您可重写此方法,以记录保存后做后处理。 请确保您调用父实例,以便正确地引发该事件。
public void applyScopes(CDbCriteria &$criteria)
| ||
$criteria | CDbCriteria | 查询条件。通过合并dbCriteria可修改此参数。 |
public function applyScopes(&$criteria)
{
if(!empty($criteria->scopes))
{
$scs=$this->scopes();
$c=$this->getDbCriteria();
foreach((array)$criteria->scopes as $k=>$v)
{
if(is_integer($k))
{
if(is_string($v))
{
if(isset($scs[$v]))
{
$c->mergeWith($scs[$v],true);
continue;
}
$scope=$v;
$params=array();
}
else if(is_array($v))
{
$scope=key($v);
$params=current($v);
}
}
else if(is_string($k))
{
$scope=$k;
$params=$v;
}
call_user_func_array(array($this,$scope),(array)$params);
}
}
if(isset($c) || ($c=$this->getDbCriteria(false))!==null)
{
$c->mergeWith($criteria);
$criteria=$c;
$this->_c=null;
}
}
适用于给定条件的查询范围。 这种方法合并dbCriteria与给定的条件参数。 它将重置dbCriteria为null。
public array attributeNames()
| ||
{return} | array | 属性名称列表 |
public function attributeNames()
{
return array_keys($this->getMetaData()->columns);
}
返回模型的所有属性名称的列表。 这将返回AR类与此相关联的所有表的列名。
protected boolean beforeDelete()
| ||
{return} | boolean | 是否应删除记录。默认值为true。 |
protected function beforeDelete()
{
if($this->hasEventHandler('onBeforeDelete'))
{
$event=new CModelEvent($this);
$this->onBeforeDelete($event);
return $event->isValid;
}
else
return true;
}
在删除记录之前调用此方法。 这个默认执行引发onBeforeDelete事件。 您可以重写此方法,以做为记录删除任何准备工作。 请确保您调用父实例,以便正确地引发该事件。
protected void beforeFind()
|
protected function beforeFind()
{
if($this->hasEventHandler('onBeforeFind'))
{
$event=new CModelEvent($this);
// for backward compatibility
$event->criteria=func_num_args()>0 ? func_get_arg(0) : null;
$this->onBeforeFind($event);
}
}
AR finder执行查找调用之前,将引发此事件。
查找调用包括find,findAll,findByPk,
findAllByPk,findByAttributes和findAllByAttributes。
这个默认执行引发onBeforeFind事件。
如果重写此方法,
请确保您调用父实例,以便正确地引发该事件。
从1.1.5版本开始,
这种方法可称为一个隐藏的参数CDbCriteria表示当前查询条件传递到一个AR方法。
public void beforeFindInternal()
|
public function beforeFindInternal()
{
$this->beforeFind();
}
调用beforeFind。 这个方法内部使用。
protected boolean beforeSave()
| ||
{return} | boolean | 是否应该执行可在,默认为true。 |
protected function beforeSave()
{
if($this->hasEventHandler('onBeforeSave'))
{
$event=new CModelEvent($this);
$this->onBeforeSave($event);
return $event->isValid;
}
else
return true;
}
保存记录之前,调用这个方法(验证后,如果有的话)。 默认实现引发onBeforeSave事件。 您可以重写此方法做任何记录保存的准备工作。 使用isNewRecord 以确认是否是插入或保存记录。 请确保您调用父实例,以便正确地引发该事件。
public CActiveRecord cache(integer $duration, CCacheDependency $dependency=NULL, integer $queryCount=1)
| ||
$duration | integer | 查询结果可能保持在缓存中有效的秒数。 如果这是0,缓存将被禁用。 |
$dependency | CCacheDependency | 保存查询结果到缓存时使用的依赖关系。 |
$queryCount | integer | 在调用此方法后,需要缓存的SQL查询的数目。 默认值为 1,这意味着下一个SQL查询将被缓存。 |
{return} | CActiveRecord | AR实例本身。 |
public function cache($duration, $dependency=null, $queryCount=1)
{
$this->getDbConnection()->cache($duration, $dependency, $queryCount);
return $this;
}
设置关于查询缓存的参数. 这是CDbConnection::cache()的一种快捷方法。 它改变查询缓存的dbConnection实例参数。
public string count(mixed $condition='', array $params=array (
))
| ||
$condition | mixed | 查询条件或标准。 |
$params | array | 要绑定到的 SQL 语句的参数 |
{return} | string | 满足指定的查询条件的行数。注:类型是字符串保持最大精度。 |
public function count($condition='',$params=array())
{
Yii::trace(get_class($this).'.count()','system.db.ar.CActiveRecord');
$builder=$this->getCommandBuilder();
$criteria=$builder->createCriteria($condition,$params);
$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);
}
}
查找满足指定查询条件的行数。 参见find()详细说明关于$condition和$params。
public string countByAttributes(array $attributes, mixed $condition='', array $params=array (
))
| ||
$attributes | array | 列表中的属性值(属性名索引)活动记录相匹配。 属性值可以是一个数组,用于生成的条件。 |
$condition | mixed | 查询条件或标准。 |
$params | array | 要绑定到的 SQL 语句的参数 |
{return} | string | 满足指定的查询条件的行数。注:类型是字符串保持最大精度。 |
public function countByAttributes($attributes,$condition='',$params=array())
{
Yii::trace(get_class($this).'.countByAttributes()','system.db.ar.CActiveRecord');
$prefix=$this->getTableAlias(true).'.';
$builder=$this->getCommandBuilder();
$criteria=$builder->createColumnCriteria($this->getTableSchema(),$attributes,$condition,$params,$prefix);
$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);
}
}
查找具有指定的属性值的行数。 参见find()详细说明关于$condition和$params。
public string countBySql(string $sql, array $params=array (
))
| ||
$sql | string | SQL语句 |
$params | array | 要绑定到的 SQL 语句的参数 |
{return} | string | 满足指定的查询条件的行数。注:类型是字符串保持最大精度。 |
public function countBySql($sql,$params=array())
{
Yii::trace(get_class($this).'.countBySql()','system.db.ar.CActiveRecord');
return $this->getCommandBuilder()->createSqlCommand($sql,$params)->queryScalar();
}
查找指定SQL语句影响的行数。 这相当于调用CDbCommand::queryScalar, 以指定的SQL声明和参数。
public array defaultScope()
| ||
{return} | array | 查询条件。 这将作为CDbCriteria参数的构造方法。 |
返回默认的命名范围,应隐含这种模式适用于所有查询。 注意,默认的范围只适用于SELECT查询。忽视对INSERT,UPDATE和DELETE查询。 默认实现只返回一个空数组。 如果模型需要一些默认的标准(如只有活动记录,当返回)查询,你可以重写此方法。
public boolean delete()
| ||
{return} | boolean | 是否删除成功。 |
public function delete()
{
if(!$this->getIsNewRecord())
{
Yii::trace(get_class($this).'.delete()','system.db.ar.CActiveRecord');
if($this->beforeDelete())
{
$result=$this->deleteByPk($this->getPrimaryKey())>0;
$this->afterDelete();
return $result;
}
else
return false;
}
else
throw new CDbException(Yii::t('yii','The active record cannot be deleted because it is new.'));
}
删除对应于此活动记录的行。
public integer deleteAll(mixed $condition='', array $params=array (
))
| ||
$condition | mixed | 查询条件或标准。 |
$params | array | 要绑定到的 SQL 语句的参数 |
{return} | integer | 删除的行数 |
public function deleteAll($condition='',$params=array())
{
Yii::trace(get_class($this).'.deleteAll()','system.db.ar.CActiveRecord');
$builder=$this->getCommandBuilder();
$criteria=$builder->createCriteria($condition,$params);
$command=$builder->createDeleteCommand($this->getTableSchema(),$criteria);
return $command->execute();
}
删除指定条件的行。 参见find()详细说明关于$condition和$params。
public integer deleteAllByAttributes(array $attributes, mixed $condition='', array $params=array (
))
| ||
$attributes | array | 列表中的属性值(属性名索引)活动记录相匹配。 属性值可以是一个数组,用于生成的条件。 |
$condition | mixed | 查询条件或标准。 |
$params | array | 要绑定到的 SQL 语句的参数 |
{return} | integer | 执行影响的行数。 |
public function deleteAllByAttributes($attributes,$condition='',$params=array())
{
Yii::trace(get_class($this).'.deleteAllByAttributes()','system.db.ar.CActiveRecord');
$builder=$this->getCommandBuilder();
$table=$this->getTableSchema();
$criteria=$builder->createColumnCriteria($table,$attributes,$condition,$params);
$command=$builder->createDeleteCommand($table,$criteria);
return $command->execute();
}
删除指定的属性值相匹配的行。 参见find()详细说明关于$condition和$params。
public integer deleteByPk(mixed $pk, mixed $condition='', array $params=array (
))
| ||
$pk | mixed | 主键值。对多个主键使用数组。复合键,对于每个键的值必须是一个数组(列名=>列值)。 |
$condition | mixed | 查询条件或标准。 |
$params | array | 要绑定到的 SQL 语句的参数 |
{return} | integer | 删除的行数 |
public function deleteByPk($pk,$condition='',$params=array())
{
Yii::trace(get_class($this).'.deleteByPk()','system.db.ar.CActiveRecord');
$builder=$this->getCommandBuilder();
$criteria=$builder->createPkCriteria($this->getTableSchema(),$pk,$condition,$params);
$command=$builder->createDeleteCommand($this->getTableSchema(),$criteria);
return $command->execute();
}
删除指定主键的行。 参见find()详细说明关于$condition和$params。
public boolean equals(CActiveRecord $record)
| ||
$record | CActiveRecord | 要比较的记录 |
{return} | boolean | 两个活动的记录是否是指数据库表中的同一行。 |
public function equals($record)
{
return $this->tableName()===$record->tableName() && $this->getPrimaryKey()===$record->getPrimaryKey();
}
当前活动记录与另一个比较。 通过比较表名和两个活动记录的主键值来作比较。
public boolean exists(mixed $condition='', array $params=array (
))
| ||
$condition | mixed | 查询条件或标准。 |
$params | array | 要绑定到的 SQL 语句的参数 |
{return} | boolean | 是否满足指定条件的行。 |
public function exists($condition='',$params=array())
{
Yii::trace(get_class($this).'.exists()','system.db.ar.CActiveRecord');
$builder=$this->getCommandBuilder();
$criteria=$builder->createCriteria($condition,$params);
$table=$this->getTableSchema();
$criteria->select='1';
$criteria->limit=1;
$this->applyScopes($criteria);
if(empty($criteria->with))
return $builder->createFindCommand($table,$criteria)->queryRow()!==false;
else
{
$criteria->select='*';
$finder=new CActiveFinder($this,$criteria->with);
return $finder->count($criteria)>0;
}
}
检查是否满足指定条件的行。 参见find()详细说明关于$condition和$params。
public CActiveRecord find(mixed $condition='', array $params=array (
))
| ||
$condition | mixed | 查询条件或标准。 如果一个字符串,它被作为查询条件 (WHERE 子句) ; 如果一个数组,它被视为构建CDbCriteria对象初始值; 否则,它应该是CDbCriteria对象的一个实例。 |
$params | array | 要绑定到的 SQL 语句的参数。 这仅仅是第一个参数是一个字符串(查询条件)时使用。 在其他情况下,请使用CDbCriteria::params设置参数。 |
{return} | CActiveRecord | 找到的记录。如果没找到任何记录,则为 null。 |
public function find($condition='',$params=array())
{
Yii::trace(get_class($this).'.find()','system.db.ar.CActiveRecord');
$criteria=$this->getCommandBuilder()->createCriteria($condition,$params);
return $this->query($criteria);
}
查找指定条件的单个活动记录。
public array findAll(mixed $condition='', array $params=array (
))
| ||
$condition | mixed | 查询条件或标准。 |
$params | array | 要绑定到的 SQL 语句的参数。 |
{return} | array | 满足指定条件的活动记录列表,如果没有找到将返回一个空的数组。 |
public function findAll($condition='',$params=array())
{
Yii::trace(get_class($this).'.findAll()','system.db.ar.CActiveRecord');
$criteria=$this->getCommandBuilder()->createCriteria($condition,$params);
return $this->query($criteria,true);
}
查找满足指定条件的所有活动记录。 参见find()详细说明关于$condition和$params。
public array findAllByAttributes(array $attributes, mixed $condition='', array $params=array (
))
| ||
$attributes | array | 列表中的属性值(属性名索引)活动记录相匹配。 属性值可以是一个数组将被用来生成一个条件。 |
$condition | mixed | 查询条件或标准。 |
$params | array | 要绑定到的 SQL 语句的参数。 |
{return} | array | 找到的记录。如果没有找到返回一个空数组。 |
public function findAllByAttributes($attributes,$condition='',$params=array())
{
Yii::trace(get_class($this).'.findAllByAttributes()','system.db.ar.CActiveRecord');
$prefix=$this->getTableAlias(true).'.';
$criteria=$this->getCommandBuilder()->createColumnCriteria($this->getTableSchema(),$attributes,$condition,$params,$prefix);
return $this->query($criteria,true);
}
查找具有指定属性值的所有活动记录。 参见find()详细说明关于$condition和$params。
public array findAllByPk(mixed $pk, mixed $condition='', array $params=array (
))
| ||
$pk | mixed | 主键值。对多个主键使用数组。复合键,对于每个键的值必须是一个数组(列名=>列值)。 |
$condition | mixed | 查询条件或标准。 |
$params | array | 要绑定到的 SQL 语句的参数。 |
{return} | array | 找到的记录。如果没有找到返回一个空数组。 |
public function findAllByPk($pk,$condition='',$params=array())
{
Yii::trace(get_class($this).'.findAllByPk()','system.db.ar.CActiveRecord');
$prefix=$this->getTableAlias(true).'.';
$criteria=$this->getCommandBuilder()->createPkCriteria($this->getTableSchema(),$pk,$condition,$params,$prefix);
return $this->query($criteria,true);
}
查找指定主键的所有活动记录。 参见find()详细说明关于$condition和$params。
public array findAllBySql(string $sql, array $params=array (
))
| ||
$sql | string | SQL语句 |
$params | array | 要绑定到的 SQL 语句的参数 |
{return} | array | 找到的记录。如果没找到任何记录,则为 null。 |
public function findAllBySql($sql,$params=array())
{
Yii::trace(get_class($this).'.findAllBySql()','system.db.ar.CActiveRecord');
$this->beforeFind();
if(($criteria=$this->getDbCriteria(false))!==null && !empty($criteria->with))
{
$this->_c=null;
$finder=new CActiveFinder($this,$criteria->with);
return $finder->findAllBySql($sql,$params);
}
else
{
$command=$this->getCommandBuilder()->createSqlCommand($sql,$params);
return $this->populateRecords($command->queryAll());
}
}
查找指定SQL语句的所有活动记录。
public CActiveRecord findByAttributes(array $attributes, mixed $condition='', array $params=array (
))
| ||
$attributes | array | 列表中的属性值(属性名索引)活动记录相匹配。 属性值可以是一个数组将被用来生成一个条件。 |
$condition | mixed | 查询条件或标准。 |
$params | array | 要绑定到的 SQL 语句的参数。 |
{return} | CActiveRecord | 找到的记录。如果没找到任何记录,则为 null。 |
public function findByAttributes($attributes,$condition='',$params=array())
{
Yii::trace(get_class($this).'.findByAttributes()','system.db.ar.CActiveRecord');
$prefix=$this->getTableAlias(true).'.';
$criteria=$this->getCommandBuilder()->createColumnCriteria($this->getTableSchema(),$attributes,$condition,$params,$prefix);
return $this->query($criteria);
}
查找具有指定属性值的单个活动记录。 参见find()详细说明关于$condition和$params。
public CActiveRecord findByPk(mixed $pk, mixed $condition='', array $params=array (
))
| ||
$pk | mixed | 主键值。对多个主键使用数组。复合键,对于每个键的值必须是一个数组(列名=>列值)。 |
$condition | mixed | 查询条件或标准。 |
$params | array | 要绑定到的 SQL 语句的参数。 |
{return} | CActiveRecord | 找到的记录。如果没找到任何记录,则为 null。 |
public function findByPk($pk,$condition='',$params=array())
{
Yii::trace(get_class($this).'.findByPk()','system.db.ar.CActiveRecord');
$prefix=$this->getTableAlias(true).'.';
$criteria=$this->getCommandBuilder()->createPkCriteria($this->getTableSchema(),$pk,$condition,$params,$prefix);
return $this->query($criteria);
}
查找指定主键的单一活动记录。 参见find()详细说明关于$condition和$params。
public CActiveRecord findBySql(string $sql, array $params=array (
))
| ||
$sql | string | SQL语句 |
$params | array | 要绑定到的 SQL 语句的参数 |
{return} | CActiveRecord | 找到的记录。如果没找到任何记录,则为 null。 |
public function findBySql($sql,$params=array())
{
Yii::trace(get_class($this).'.findBySql()','system.db.ar.CActiveRecord');
$this->beforeFind();
if(($criteria=$this->getDbCriteria(false))!==null && !empty($criteria->with))
{
$this->_c=null;
$finder=new CActiveFinder($this,$criteria->with);
return $finder->findBySql($sql,$params);
}
else
{
$command=$this->getCommandBuilder()->createSqlCommand($sql,$params);
return $this->populateRecord($command->queryRow());
}
}
查找指定SQL语句的单个活动记录。
public CActiveRelation getActiveRelation(string $name)
| ||
$name | string | 关系名称 |
{return} | CActiveRelation | 为此AR类声明命名的关系。如果关系不存在则为null。 |
public function getActiveRelation($name)
{
return isset($this->getMetaData()->relations[$name]) ? $this->getMetaData()->relations[$name] : null;
}
返回此AR类声明的命名关系。
public mixed getAttribute(string $name)
| ||
$name | string | 属性名称 |
{return} | mixed | 属性值。如果属性未设置或不存在则为null。 |
public function getAttribute($name)
{
if(property_exists($this,$name))
return $this->$name;
else if(isset($this->_attributes[$name]))
return $this->_attributes[$name];
}
返回命名的属性值。 如果这是一个新的记录,该属性未设置之前, 将返回的列的默认值。 如果该记录是查询的结果并不加载该属性时, 将返回null。 你也可以使用$this->AttributeName来获得属性值。
参见
public string getAttributeLabel(string $attribute)
| ||
$attribute | string | 属性名称 |
{return} | string | 属性标签 |
public function getAttributeLabel($attribute)
{
$labels=$this->attributeLabels();
if(isset($labels[$attribute]))
return $labels[$attribute];
else if(strpos($attribute,'.')!==false)
{
$segs=explode('.',$attribute);
$name=array_pop($segs);
$model=$this;
foreach($segs as $seg)
{
$relations=$model->getMetaData()->relations;
if(isset($relations[$seg]))
$model=CActiveRecord::model($relations[$seg]->className);
else
break;
}
return $model->getAttributeLabel($name);
}
else
return $this->generateAttributeLabel($attribute);
}
返回指定属性的文本标签。 这个方法重写父类, 支持返回关系对象中定义的标签。 特别注意,如果属性名称是"post.author.name"的形式, 那么此方法会从"author"关系"name"中获得属性标签。
public array getAttributes(mixed $names=true)
| ||
$names | mixed | 属性的名称,其值必须返回。 如果这是true(默认),将返回所有属性, 包括那些没有从数据库加载的(这些属性将返回空)。 如果为null,则将返回所有属性,数据库未被加载的除外。 |
{return} | array | attribute values indexed by attribute names. |
public function getAttributes($names=true)
{
$attributes=$this->_attributes;
foreach($this->getMetaData()->columns as $name=>$column)
{
if(property_exists($this,$name))
$attributes[$name]=$this->$name;
else if($names===true && !isset($attributes[$name]))
$attributes[$name]=null;
}
if(is_array($names))
{
$attrs=array();
foreach($names as $name)
{
if(property_exists($this,$name))
$attrs[$name]=$this->$name;
else
$attrs[$name]=isset($attributes[$name])?$attributes[$name]:null;
}
return $attrs;
}
else
return $attributes;
}
返回所有列的属性值。 注意,不返回相关的对象。
public CDbCommandBuilder getCommandBuilder()
| ||
{return} | CDbCommandBuilder | 这个命令生成器属于AR类 |
public function getCommandBuilder()
{
return $this->getDbConnection()->getSchema()->getCommandBuilder();
}
返回此AR的命令生成器。
public CDbConnection getDbConnection()
| ||
{return} | CDbConnection | 活动记录使用的数据库连接。 |
public function getDbConnection()
{
if(self::$db!==null)
return self::$db;
else
{
self::$db=Yii::app()->getDb();
if(self::$db instanceof CDbConnection)
return self::$db;
else
throw new CDbException(Yii::t('yii','Active Record requires a "db" CDbConnection application component.'));
}
}
返回活动记录所使用的数据库连接。 默认情况下,"db"应用程序组件用作数据库连接。 如果您要使用一个不同的数据库连接,您可以重写此方法。
public CDbCriteria getDbCriteria(boolean $createIfNull=true)
| ||
$createIfNull | boolean | 是否创建一个条件实例如果它不存在。默认值为true。 |
{return} | CDbCriteria | 和这个模型相关的查询条件。 这个条件主要被 named scope使用, 特征是积累不同的条件规范。 |
public function getDbCriteria($createIfNull=true)
{
if($this->_c===null)
{
if(($c=$this->defaultScope())!==array() || $createIfNull)
$this->_c=new CDbCriteria($c);
}
return $this->_c;
}
返回和这个模型相关的查询条件。
public boolean getIsNewRecord()
| ||
{return} | boolean | 该记录是否是新的,就插入时调用save。 在构造函数和populateRecord自动设置此属性。 默认值为false, 如果使用new运算符创建实例,它会被设置为true。 |
public function getIsNewRecord()
{
return $this->_new;
}
返回当前记录是否是新的。
public CActiveRecordMetaData getMetaData()
| ||
{return} | CActiveRecordMetaData | 这个AR类的元数据。 |
public function getMetaData()
{
if($this->_md!==null)
return $this->_md;
else
return $this->_md=self::model(get_class($this))->_md;
}
返回这个AR的元数据。
public mixed getOldPrimaryKey()
| ||
{return} | mixed | 旧的主键值。则返回数组(列名=>列值)如果主键是复合型。 If primary key is not defined, null will be returned. |
public function getOldPrimaryKey()
{
return $this->_pk;
}
返回旧的主键值。 这指的是主键值已填充到记录后, 执行查找方法 (例如: find(),findAll()), 即使主关键属性都会被手动分配一个不同的值,值保持不变。
public mixed getPrimaryKey()
| ||
{return} | mixed | 主键值。则返回数组(列名=>列值)如果主键是复合型。 如果没有定义主键,将返回null。 |
public function getPrimaryKey()
{
$table=$this->getMetaData()->tableSchema;
if(is_string($table->primaryKey))
return $this->{$table->primaryKey};
else if(is_array($table->primaryKey))
{
$values=array();
foreach($table->primaryKey as $name)
$values[$name]=$this->$name;
return $values;
}
else
return null;
}
返回主键值。
public mixed getRelated(string $name, boolean $refresh=false, array $params=array (
))
| ||
$name | string | 关系名 (参见relations) |
$refresh | boolean | 是否从数据库重新载入相关对象,默认值为false。 |
$params | array | 附加参数,在关系声明中指定自定义查询条件。 |
{return} | mixed | 相关对象. |
public function getRelated($name,$refresh=false,$params=array())
{
if(!$refresh && $params===array() && (isset($this->_related[$name]) || array_key_exists($name,$this->_related)))
return $this->_related[$name];
$md=$this->getMetaData();
if(!isset($md->relations[$name]))
throw new CDbException(Yii::t('yii','{class} does not have relation "{name}".',
array('{class}'=>get_class($this), '{name}'=>$name)));
Yii::trace('lazy loading '.get_class($this).'.'.$name,'system.db.ar.CActiveRecord');
$relation=$md->relations[$name];
if($this->getIsNewRecord() && !$refresh && ($relation instanceof CHasOneRelation || $relation instanceof CHasManyRelation))
return $relation instanceof CHasOneRelation ? null : array();
if($params!==array()) // dynamic query
{
$exists=isset($this->_related[$name]) || array_key_exists($name,$this->_related);
if($exists)
$save=$this->_related[$name];
$r=array($name=>$params);
}
else
$r=$name;
unset($this->_related[$name]);
$finder=new CActiveFinder($this,$r);
$finder->lazyFind($this);
if(!isset($this->_related[$name]))
{
if($relation instanceof CHasManyRelation)
$this->_related[$name]=array();
else if($relation instanceof CStatRelation)
$this->_related[$name]=$relation->defaultValue;
else
$this->_related[$name]=null;
}
if($params!==array())
{
$results=$this->_related[$name];
if($exists)
$this->_related[$name]=$save;
else
unset($this->_related[$name]);
return $results;
}
else
return $this->_related[$name];
}
返回相关的记录。 这个方法将返回当前记录的相关记录。 如果关系是 HAS_ONE 或 BELONGS_TO, 如果对象不存在,将返回一个单个对象或null。 如果关系是HAS_MANY 或 MANY_MANY, 它返回一个对象数组或一个空数组。
public string getTableAlias(boolean $quote=false, boolean $checkScopes=true)
| ||
$quote | boolean | 是否要引用别名 |
$checkScopes | boolean | 检测别名当前是否在应用范围被定义。 调用defaultScope此方法时,这个参数必须被设置为false。 否则将形成一个无限循环。 |
{return} | string | 默认表别名 |
public function getTableAlias($quote=false, $checkScopes=true)
{
if($checkScopes && ($criteria=$this->getDbCriteria(false))!==null && $criteria->alias!='')
$alias=$criteria->alias;
else
$alias=$this->_alias;
return $quote ? $this->getDbConnection()->getSchema()->quoteTableName($alias) : $alias;
}
返回由 find 方法使用表的别名。 在关系查询,根据对应关系的声明, 返回的表的别名可能会有所不同。 此外,由setTableAlias可以由应用的范围覆盖。
public CDbTableSchema getTableSchema()
| ||
{return} | CDbTableSchema | 这个表的元数据属于AR类 |
public function getTableSchema()
{
return $this->getMetaData()->tableSchema;
}
返回表的元数据,这属于AR类。
public boolean hasAttribute(string $name)
| ||
$name | string | 属性名称 |
{return} | boolean | 这是否是AR命名的属性(table column). |
public function hasAttribute($name)
{
return isset($this->getMetaData()->columns[$name]);
}
检查此AR是否有命名的属性。
public boolean hasRelated(string $name)
| ||
$name | string | 关系名 |
{return} | boolean | 返回一个值指示是否命名相关对象被载入。 |
public function hasRelated($name)
{
return isset($this->_related[$name]) || array_key_exists($name,$this->_related);
}
返回一个值,该值指示是否已加载命名的相关对象。
public void init()
|
初始化这个模型。 当一个AR实例是新创建的或有它的scenario设置, 这个方法被触发。 您可以重写此方法以提供所需的初始化的代码模型 (例如:设置初始的属性值)。
public boolean insert(array $attributes=NULL)
| ||
$attributes | array | 需要保存的属性列表。默认为null, 这意味着从数据库中加载的所有属性将被保存。 |
{return} | boolean | 属性是否有效,并将记录插入成功。 |
public function insert($attributes=null)
{
if(!$this->getIsNewRecord())
throw new CDbException(Yii::t('yii','The active record cannot be inserted to database because it is not new.'));
if($this->beforeSave())
{
Yii::trace(get_class($this).'.insert()','system.db.ar.CActiveRecord');
$builder=$this->getCommandBuilder();
$table=$this->getMetaData()->tableSchema;
$command=$builder->createInsertCommand($table,$this->getAttributes($attributes));
if($command->execute())
{
$primaryKey=$table->primaryKey;
if($table->sequenceName!==null)
{
if(is_string($primaryKey) && $this->$primaryKey===null)
$this->$primaryKey=$builder->getLastInsertID($table);
else if(is_array($primaryKey))
{
foreach($primaryKey as $pk)
{
if($this->$pk===null)
{
$this->$pk=$builder->getLastInsertID($table);
break;
}
}
}
}
$this->_pk=$this->getPrimaryKey();
$this->afterSave();
$this->setIsNewRecord(false);
$this->setScenario('update');
return true;
}
}
return false;
}
插入一行到基于这个ActiveRecord的属性表。 如果表的主键是自动增量和插入前为null, 将插入后的实际值填充。 注意,验证不执行此方法。你可以调用validate执行验证。 记录成功插入到数据库后,它的isNewRecord属性将设置为false, 和它的scenario属性将设置为‘update’。
protected CActiveRecord instantiate(array $attributes)
| ||
$attributes | array | 活动记录的属性值列表。 |
{return} | CActiveRecord | 活动记录 |
protected function instantiate($attributes)
{
$class=get_class($this);
$model=new $class(null);
return $model;
}
创建活动记录实例。 这个方法调用populateRecord和populateRecords。 如果正在创建的实例, 你可以重写此方法,取决于填充纪录的属性。 例如,通过创建基于列的值的记录, 你可以实现所谓的单表继承映射。
public static CActiveRecord model(string $className='CActiveRecord')
| ||
$className | string | 活动记录类的名称。 |
{return} | CActiveRecord | 活动记录模型的一个实例。 |
public static function model($className=__CLASS__)
{
if(isset(self::$_models[$className]))
return self::$_models[$className];
else
{
$model=self::$_models[$className]=new $className(null);
$model->_md=new CActiveRecordMetaData($model);
$model->attachBehaviors($model->behaviors());
return $model;
}
}
返回指定AR类的静态模型。
返回的模型是一个静态的AR类的实例。
它提供了用于调用类级别的方法(某些似乎于静态类方法。)
每个派生类必须重写此方法如下,
public static function model($className=__CLASS__) { return parent::model($className); }
public boolean offsetExists(mixed $offset)
| ||
$offset | mixed | 检查到的偏移量 |
{return} | boolean |
public function offsetExists($offset)
{
return $this->__isset($offset);
}
返回是否有指定偏移量的元素。 这种方法需要接口ArrayAccess。
public void onAfterDelete(CEvent $event)
| ||
$event | CEvent | 事件参数 |
public function onAfterDelete($event)
{
$this->raiseEvent('onAfterDelete',$event);
}
在删除记录之后,将引发此事件。
public void onAfterFind(CEvent $event)
| ||
$event | CEvent | 事件参数 |
public function onAfterFind($event)
{
$this->raiseEvent('onAfterFind',$event);
}
引发此事件记录后找到方法的实例。
public void onAfterSave(CEvent $event)
| ||
$event | CEvent | 事件参数 |
public function onAfterSave($event)
{
$this->raiseEvent('onAfterSave',$event);
}
保存记录之后,将引发此事件。
public void onBeforeDelete(CModelEvent $event)
| ||
$event | CModelEvent | 事件参数 |
public function onBeforeDelete($event)
{
$this->raiseEvent('onBeforeDelete',$event);
}
在删除记录之前,将引发此事件。 通过设置CModelEvent::isValid为false,正常delete()进程被停止。
public void onBeforeFind(CModelEvent $event)
| ||
$event | CModelEvent | 事件参数 |
public function onBeforeFind($event)
{
$this->raiseEvent('onBeforeFind',$event);
}
AR finder执行查找调用之前,将引发此事件。 在这种情况下,这CModelEvent::criteria个属性作为参数传递给此方法作为查询条件。 如果你要访问范围中指定的查询条件, 请使用getDbCriteria()。 你可以修改任何条件,根据需求定制。
参见
public void onBeforeSave(CModelEvent $event)
| ||
$event | CModelEvent | 事件参数 |
public function onBeforeSave($event)
{
$this->raiseEvent('onBeforeSave',$event);
}
保存记录之前,将引发此事件。 通过设置CModelEvent::isValid为false,正常save()进程被停止。
public CActiveRecord populateRecord(array $attributes, boolean $callAfterFind=true)
| ||
$attributes | array | 属性值(列名=>列值) |
$callAfterFind | boolean | 是否要记录后调用afterFind填充。 |
{return} | CActiveRecord | 新创建的活动记录。类的对象是相同的模型类。 如果输入的数据是false,则返回null。 |
public function populateRecord($attributes,$callAfterFind=true)
{
if($attributes!==false)
{
$record=$this->instantiate($attributes);
$record->setScenario('update');
$record->init();
$md=$record->getMetaData();
foreach($attributes as $name=>$value)
{
if(property_exists($record,$name))
$record->$name=$value;
else if(isset($md->columns[$name]))
$record->_attributes[$name]=$value;
}
$record->_pk=$record->getPrimaryKey();
$record->attachBehaviors($record->behaviors());
if($callAfterFind)
$record->afterFind();
return $record;
}
else
return null;
}
给指定的属性创建活动记录 此方法由 find 方法内部使用。
public array populateRecords(array $data, boolean $callAfterFind=true, string $index=NULL)
| ||
$data | array | 活动记录的属性值列表。 |
$callAfterFind | boolean | 是否要记录后调用afterFind填充。 |
$index | string | 其值将用作查询结果数组索引属性的名称。 如果为null,这意味着将从零开始的整数索引的数组。 |
{return} | array | 活动记录的列表 |
public function populateRecords($data,$callAfterFind=true,$index=null)
{
$records=array();
foreach($data as $attributes)
{
if(($record=$this->populateRecord($attributes,$callAfterFind))!==null)
{
if($index===null)
$records[]=$record;
else
$records[$record->$index]=$record;
}
}
return $records;
}
创建基于输入数据的活动记录的列表。 此方法由 find 方法内部使用。
public mixed primaryKey()
| ||
{return} | mixed | 相关数据表的主键。 如果该键是一个单一的列,它应当返回列的名称; 如果键是由多个列组成的复合键, 它应该返回数组的键列名称。 |
返回相关数据库表的主键。 这种方法是指表没有定义主键时(一些legency数据库)的情况下重写。 如果表已定义主键, 你不需要重写此方法。默认实现只返回null, 意思是返回在数据库中定义的主键。
protected mixed query(CDbCriteria $criteria, boolean $all=false)
| ||
$criteria | CDbCriteria | the query criteria |
$all | boolean | whether to return all data |
{return} | mixed | the AR objects populated with the query result |
protected function query($criteria,$all=false)
{
$this->beforeFind();
$this->applyScopes($criteria);
if(empty($criteria->with))
{
if(!$all)
$criteria->limit=1;
$command=$this->getCommandBuilder()->createFindCommand($this->getTableSchema(),$criteria);
return $all ? $this->populateRecords($command->queryAll(), true, $criteria->index) : $this->populateRecord($command->queryRow());
}
else
{
$finder=new CActiveFinder($this,$criteria->with);
return $finder->query($criteria,$all);
}
}
执行实际的数据库查询和填充AR对象的查询结果。 此方法由其他 AR 查询方法调用,主要是内部使用。
public boolean refresh()
| ||
{return} | boolean | 该行是否仍然存在于数据库中。如果情况属实,最新的数据将被填充到这个活动记录。 |
public function refresh()
{
Yii::trace(get_class($this).'.refresh()','system.db.ar.CActiveRecord');
if(!$this->getIsNewRecord() && ($record=$this->findByPk($this->getPrimaryKey()))!==null)
{
$this->_attributes=array();
$this->_related=array();
foreach($this->getMetaData()->columns as $name=>$column)
{
if(property_exists($this,$name))
$this->$name=$record->$name;
else
$this->_attributes[$name]=$record->$name;
}
return true;
}
else
return false;
}
最新的数据将被填充到这个活动记录。
public void refreshMetaData()
|
public function refreshMetaData()
{
$finder=self::model(get_class($this));
$finder->_md=new CActiveRecordMetaData($finder);
if($this!==$finder)
$this->_md=$finder->_md;
}
刷新这个AR类的元数据。 通过调用这个方法,这个AR类将重新生成需要的元数据。 如果表的结构已经改变,且你想要使用最新的,这是非常有用的。 在你调用这个方法前,确保你已经调用CDbSchema::refresh, 要不然,旧表的的数据结构仍被使用。
public array relations()
| ||
{return} | array | 相关对象申明列表。 默认值为空数组。 |
申明关系的对象,应重写此方法。
可能存在两个活动记录对象之间的关系有四种类型:
- BELONGS_TO: 例如,成员属于一个团队;
- HAS_ONE: 例如,成员有个人资料;
- HAS_MANY: 例如,一个团队有很多成员;
- MANY_MANY: 例如,成员有很多的技巧和技能是属于这个成员的;
除了上述的关系类型, 还支持一种特殊的关系称为STAT,可以用来进行统计查询(或聚合查询)。 它检索聚合对相关对象的信息, 如每个帖子,对于每个产品,平均分数为注释的数目等。
相关对象的每个类定义在此方法中作为具有以下元素的数组:
'varName'=>array('relationType', 'className', 'foreign_key', ...additional options)其中‘varName’是批变量/属性的名称,可以通过对象来访问; ‘relationType’是指关系的类型,它可以是以下四种常量之一, self::BELONGS_TO,self::HAS_ONE,self::HAS_MANY 和 self::MANY_MANY; ‘className’是指活动记录类的相关对象的名称; 和‘foreign_key’规定的外键涉及两种活动记录。 请注意复合外键, 他们可以一起列出,以逗号分隔,或者作为一个数组指定数组的格式(‘key1,key2’)。 如果你需要指定自定义的pk->fk关联,你可以定义数组(‘fk’=> ‘pk')。 对于组合键这将是数组(‘fk_c1’=>‘pk_с1’,‘fk_c2’=>‘pk_c2’)。 MANY_MANY关系中使用外键, 加入表必须声明为(例如:‘join_table(fk1,fk2)’)。
其余数组元素的名称-值,可以指定其他选项:
- 'select': string|array, 被选中的列列表。默认值为 '*',这意味着是所有列。 如果它们出现在一个表达式中(例如: COUNT(relationName.name) AS name_count)。
- 'condition': string, WHERE子句。 默认值为空。 注意,列引用需要加入'relationName'前缀 。(例如:relationName.age>20)
- 'order': string, ORDER BY子句。 默认值为空。 注意,列引用需要加入'relationName'前缀 。(例如:relationName.age DESC)
- 'with': string|array, 应该与这个对象一起装载的子对象相关名单。 注意,这仅仅是延迟加载,而不是预先加载。
- 'joinType': 联接类型。 默认值为‘LEFT OUTER JOIN’。
- 'alias': 关系与关联表的别名。 它默认为null, 意味着表的别名与关系名称相同。
- 'params': 参数绑定到要生成的SQL语句上。 这应作为名称-值的数组。
- 'on': ON 子句。 此处指定的条件将追加到使用 AND 运算符的联接条件。
- 'index': 其值应作为存储相关的对象的数组的键的列的名称。 此选项仅适用于, HAS_MANY 和 MANY_MANY 关系。
- 'scopes': 应用范围。在单一的范围情况下可以像'scopes'=>'scopeName', 在多个作用域范围情况下可以使用数组像这样'scopes'=>array('scopeName1','scopeName2')。 此选项自版本 1.1.9 可用。
延迟加载时有一定的关系,下列选项可用:
- 'group': string, GROUP BY子句。 默认值为空。 注意,列引用需要加入'relationName'前缀 。(例如: relationName.age)。此选项仅适用于HAS_MANY 和 MANY_MANY 关系。
- 'having': string, HAVING子句。 默认值为空。 注意,列引用需要加入'relationName'前缀 。(例如: relationName.age)。此选项仅适用于HAS_MANY 和 MANY_MANY 关系。
- 'limit': 数据行的limit选择。 这个选项不能应用到BELONGS_TO。
- 'offset': 数据行的偏移量。 这个选项不能应用到BELONGS_TO。
- 'through': 获取相关的数据时将用作桥的模型的关系的名称。可以设置仅为 HAS_ONE 和 HAS_MANY。此选项自版本 1.1.7 可用。
以下是一个例子,为 'Post' 活动记录类相关对象的一个示例:
return array( 'author'=>array(self::BELONGS_TO, 'User', 'author_id'), 'comments'=>array(self::HAS_MANY, 'Comment', 'post_id', 'with'=>'author', 'order'=>'create_time DESC'), 'tags'=>array(self::MANY_MANY, 'Tag', 'post_tag(post_id, tag_id)', 'order'=>'name'), );
public CActiveRecord resetScope()
| ||
{return} | CActiveRecord |
public function resetScope()
{
$this->_c=new CDbCriteria();
return $this;
}
重置所有变量作用域,包括默认的范围。
public boolean save(boolean $runValidation=true, array $attributes=NULL)
| ||
$runValidation | boolean | 保存记录之前是否执行验证。 如果验证失败,记录不会被保存到数据库。 |
$attributes | array | 需要保存的属性列表。 默认为null,这意味着从数据库中加载的所有属性将被保存。 |
{return} | boolean | whether the saving succeeds |
public function save($runValidation=true,$attributes=null)
{
if(!$runValidation || $this->validate($attributes))
return $this->getIsNewRecord() ? $this->insert($attributes) : $this->update($attributes);
else
return false;
}
保存当前的记录。
插入记录到数据表的一行,
如果它的isNewRecord属性为true(通常情况下使用的‘new’运算符来创建记录)。
否则,
将被用于更新表中的相应行(通常情况下,使用‘find’方法来查找记录)。
保存记录之前将执行验证。
如果验证失败,该记录将不会保存。
你可以调用getErrors()检索验证错误。
如果该记录通过插入保存,
它isNewRecord的属性会被设置为false,和它的scenario属性被设置为‘update’。
如果其主键是自动增量,并且在插入之前未设置,
将使用自动生成的值来填充主键。
public boolean saveAttributes(array $attributes)
| ||
$attributes | array | 要更新的属性。 每个元素表示的属性名称或按其名称索引的属性值。 如果是后者,记录的属性将据此之前保存的更改。 |
{return} | boolean | 更新是否成功 |
public function saveAttributes($attributes)
{
if(!$this->getIsNewRecord())
{
Yii::trace(get_class($this).'.saveAttributes()','system.db.ar.CActiveRecord');
$values=array();
foreach($attributes as $name=>$value)
{
if(is_integer($name))
$values[$value]=$this->$value;
else
$values[$name]=$this->$name=$value;
}
if($this->_pk===null)
$this->_pk=$this->getPrimaryKey();
if($this->updateByPk($this->getOldPrimaryKey(),$values)>0)
{
$this->_pk=$this->getPrimaryKey();
return true;
}
else
return false;
}
else
throw new CDbException(Yii::t('yii','The active record cannot be updated because it is new.'));
}
保存所选的属性列表。 不同于save,这个方法只保存现有的列数据集的指定的属性, 并且不调用beforeSave或afterSave。 请注意这个方法不过滤属性也不做验证。 所以不要这种方法接受不受信任的数据(如用户发布的数据)。 如果你想这样做,可以考虑以下方法代替:
$postRecord=Post::model()->findByPk($postID); $postRecord->attributes=$_POST['post']; $postRecord->save();
public boolean saveCounters(array $counters)
| ||
$counters | array | 要更新计数器(列名=>增量值) |
{return} | boolean | 保存是否成功 |
public function saveCounters($counters)
{
Yii::trace(get_class($this).'.saveCounters()','system.db.ar.CActiveRecord');
$builder=$this->getCommandBuilder();
$table=$this->getTableSchema();
$criteria=$builder->createPkCriteria($table,$this->getOldPrimaryKey());
$command=$builder->createUpdateCounterCommand($this->getTableSchema(),$counters,$criteria);
if($command->execute())
{
foreach($counters as $name=>$value)
$this->$name=$this->$name+$value;
return true;
}
else
return false;
}
保存一个或多当前AR对象到计数器。 请注意,此方法不同于updateCounters , 它只保存当前AR对象。 用法示例如下所示:
$postRecord=Post::model()->findByPk($postID); $postRecord->saveCounters(array('view_count'=>1));如果你想减少计数器,请使用负值。
public array scopes()
| ||
{return} | array | 范围的界定。数组中的键范围名称; 数组中的值是相应的范围定义。 每个范围定义被表示为一个数组,其键必须是CDbCriteria的属性。 |
返回申明的命名范围。 代表一个查询条件的命名范围,可以串连在一起与其他的命名范围和查询。 这种方法应该重写, 子类声明为特定的AR类的命名范围。 例如, 下面的代码声明两个命名范围‘recently’和‘published’。
return array( 'published'=>array( 'condition'=>'status=1', ), 'recently'=>array( 'order'=>'create_time DESC', 'limit'=>5, ), );如果上述范围的申明在Post模型, 我们可以执行以下查询:
$posts=Post::model()->published()->findAll(); $posts=Post::model()->published()->recently()->findAll(); $posts=Post::model()->published()->with('comments')->findAll();需要注意的是最后一个查询是一个关联查询。
public boolean setAttribute(string $name, mixed $value)
| ||
$name | string | 属性名称 |
$value | mixed | 属性值 |
{return} | boolean | 属性是否存在和任务成功进行 |
public function setAttribute($name,$value)
{
if(property_exists($this,$name))
$this->$name=$value;
else if(isset($this->getMetaData()->columns[$name]))
$this->_attributes[$name]=$value;
else
return false;
return true;
}
设置命名的属性值。 你也可以使用$this->AttributeName来设置属性值。
参见
public void setDbCriteria(CDbCriteria $criteria)
| ||
$criteria | CDbCriteria | 查询条件 |
public function setDbCriteria($criteria)
{
$this->_c=$criteria;
}
为当前模型设置查询条件.
public void setIsNewRecord(boolean $value)
| ||
$value | boolean | 该记录是否是新的,就插入时调用save。 |
public function setIsNewRecord($value)
{
$this->_new=$value;
}
设置记录是否是新的。
public void setOldPrimaryKey(mixed $value)
| ||
$value | mixed | 旧主键值。 |
public function setOldPrimaryKey($value)
{
$this->_pk=$value;
}
设置旧的主键值。
public void setPrimaryKey(mixed $value)
| ||
$value | mixed | 新的主键值。如果主键是复合类型, 应提供一个新值做为数组(列名=>列值)。 |
public function setPrimaryKey($value)
{
$this->_pk=$this->getPrimaryKey();
$table=$this->getMetaData()->tableSchema;
if(is_string($table->primaryKey))
$this->{$table->primaryKey}=$value;
else if(is_array($table->primaryKey))
{
foreach($table->primaryKey as $name)
$this->$name=$value[$name];
}
}
设置主键值。 调用此方法后,旧的主键值,可以从oldPrimaryKey得到。
public void setTableAlias(string $alias)
| ||
$alias | string | 在查询中使用表的别名。别名不应该加引号。 |
public function setTableAlias($alias)
{
$this->_alias=$alias;
}
设置表在查询中使用的别名。
public string tableName()
| ||
{return} | string | 返回表名 |
public function tableName()
{
return get_class($this);
}
返回关联的数据库表的名称。 默认情况下,这个方法返回类名作为表名。 你可以覆盖这个方法,如果此列没有命名在这次约定之后。
public CActiveRecord together()
| ||
{return} | CActiveRecord | AR对象本身。 |
public function together()
{
$this->getDbCriteria()->together=true;
return $this;
}
设置CDbCriteria::together属性为true。 这只用于关系AR查询。 请参见CDbCriteria::together更多详细。
public boolean update(array $attributes=NULL)
| ||
$attributes | array | 需要保存的属性列表。默认为null, 这意味着从数据库中加载的所有属性将被保存。 |
{return} | boolean | 更新是否成功 |
public function update($attributes=null)
{
if($this->getIsNewRecord())
throw new CDbException(Yii::t('yii','The active record cannot be updated because it is new.'));
if($this->beforeSave())
{
Yii::trace(get_class($this).'.update()','system.db.ar.CActiveRecord');
if($this->_pk===null)
$this->_pk=$this->getPrimaryKey();
$this->updateByPk($this->getOldPrimaryKey(),$this->getAttributes($attributes));
$this->_pk=$this->getPrimaryKey();
$this->afterSave();
return true;
}
else
return false;
}
更新此活动记录所表示的行。 已加载的所有属性都将保存到数据库中。 注意,验证不执行此方法。你可以调用validate执行验证。
public integer updateAll(array $attributes, mixed $condition='', array $params=array (
))
| ||
$attributes | array | 用于更新的属性列表(name=>$value)。 |
$condition | mixed | 查询条件或标准。 |
$params | array | 要绑定到的 SQL 语句的参数 |
{return} | integer | 被更新的行数 |
public function updateAll($attributes,$condition='',$params=array())
{
Yii::trace(get_class($this).'.updateAll()','system.db.ar.CActiveRecord');
$builder=$this->getCommandBuilder();
$criteria=$builder->createCriteria($condition,$params);
$command=$builder->createUpdateCommand($this->getTableSchema(),$attributes,$criteria);
return $command->execute();
}
更新使用指定条件的记录。 参见find()详细说明关于$condition和$params。 注意,属性没有做安全检测和校验。
public integer updateByPk(mixed $pk, array $attributes, mixed $condition='', array $params=array (
))
| ||
$pk | mixed | 主键值。对多个主键使用数组。复合键,对于每个键的值必须是一个数组(列名=>列值)。 |
$attributes | array | 用于更新的属性列表(name=>$value)。 |
$condition | mixed | 查询条件或标准。 |
$params | array | 要绑定到的 SQL 语句的参数 |
{return} | integer | 被更新的行数 |
public function updateByPk($pk,$attributes,$condition='',$params=array())
{
Yii::trace(get_class($this).'.updateByPk()','system.db.ar.CActiveRecord');
$builder=$this->getCommandBuilder();
$table=$this->getTableSchema();
$criteria=$builder->createPkCriteria($table,$pk,$condition,$params);
$command=$builder->createUpdateCommand($table,$attributes,$criteria);
return $command->execute();
}
更新指定主键记录的行。 参见find()详细说明关于$condition和$params。 注意,属性没有做安全检测和校验。
public integer updateCounters(array $counters, mixed $condition='', array $params=array (
))
| ||
$counters | array | 要更新的计数器(列名=>增量值) |
$condition | mixed | 查询条件或标准。 |
$params | array | 要绑定到的 SQL 语句的参数 |
{return} | integer | 被更新的行数 |
public function updateCounters($counters,$condition='',$params=array())
{
Yii::trace(get_class($this).'.updateCounters()','system.db.ar.CActiveRecord');
$builder=$this->getCommandBuilder();
$criteria=$builder->createCriteria($condition,$params);
$command=$builder->createUpdateCounterCommand($this->getTableSchema(),$counters,$criteria);
return $command->execute();
}
更新的一个或多个计数器。 请注意,除非指定一个条件或标准,这将更新所有数据行。 参见find()详细说明关于$condition和$params。
参见
public CActiveRecord with()
| ||
{return} | CActiveRecord | AR对象本身。 |
public function with()
{
if(func_num_args()>0)
{
$with=func_get_args();
if(is_array($with[0])) // the parameter is given as an array
$with=$with[0];
if(!empty($with))
$this->getDbCriteria()->mergeWith(array('with'=>$with));
}
return $this;
}
指定相关对象应一起载入。 这个方法采取变量的参数。 每个参数指定关系或子关系的名称。例如,
// find all posts together with their author and comments Post::model()->with('author','comments')->findAll(); // find all posts together with their author and the author's profile Post::model()->with('author','author.profile')->findAll();应用中声明的关系relations()。
默认情况下,在指定的relations()选项将被用来做关联查询。 为了自定义动态选项,我们应将一个数组参数传递给 with() 方法。 数组的键是关系的名称, 和数组值对应的查询选项。 例如:
Post::model()->with(array( 'author'=>array('select'=>'id, name'), 'comments'=>array('condition'=>'approved=1', 'order'=>'create_time'), ))->findAll();