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 $
源码
CActiveRecord代表关系数据的类的基类。

它实现了活动记录设计模式,一种流行的对象关系映射(ORM)技术。 请点击the Guide更多关于这个类的 详细信息。

公共属性

属性 类型 描述 定义在
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

属性详细

attributes 属性
public array getAttributes(mixed $names=true)
public void setAttributes(array $values, boolean $safeOnly=true)

返回所有列的属性值。 注意,不返回相关的对象。

commandBuilder 属性 只读

返回此AR的命令生成器。

db 属性
public static CDbConnection $db;

所有活动记录类的默认数据库连接。 默认情况下,这是'db'应用程序组件,

dbConnection 属性 只读

返回活动记录所使用的数据库连接。 默认情况下,"db"应用程序组件用作数据库连接。 如果您要使用一个不同的数据库连接,您可以重写此方法。

dbCriteria 属性
public CDbCriteria getDbCriteria(boolean $createIfNull=true)
public void setDbCriteria(CDbCriteria $criteria)

返回和这个模型相关的查询条件。

isNewRecord 属性
public boolean getIsNewRecord()
public void setIsNewRecord(boolean $value)

返回当前记录是否是新的。

metaData 属性 只读

返回这个AR的元数据。

oldPrimaryKey 属性 (可用自 v1.1.0)
public mixed getOldPrimaryKey()
public void setOldPrimaryKey(mixed $value)

返回旧的主键值。 这指的是主键值已填充到记录后, 执行查找方法 (例如: find(),findAll()), 即使主关键属性都会被手动分配一个不同的值,值保持不变。

primaryKey 属性
public mixed getPrimaryKey()
public void setPrimaryKey(mixed $value)

返回主键值。

tableAlias 属性 (可用自 v1.1.1)
public string getTableAlias(boolean $quote=false, boolean $checkScopes=true)
public void setTableAlias(string $alias)

返回由 find 方法使用表的别名。 在关系查询,根据对应关系的声明, 返回的表的别名可能会有所不同。 此外,由setTableAlias可以由应用的范围覆盖。

tableSchema 属性 只读

返回表的元数据,这属于AR类。

方法详细

__call() 方法
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魔术方法实现了这个命名范围的功能。

__construct() 方法
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();
}

构造函数。

__get() 方法
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属性能像属性那样访问。

参见

__isset() 方法
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。 通过检测,如果命令属性为空或不存在, 此方法重写父类。

__set() 方法
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属性能像属性那样访问。

__sleep() 方法
public array __sleep()
{return} array
public function __sleep()
{
    
$this->_md=null;
    return 
array_keys((array)$this);
}

PHP sleep 魔术方法。 此方法确保模型元数据引用被设置为 null。

__unset() 方法
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);
}

检查属性值是否为空。 通过检测,如果命令属性为空或不存在, 此方法重写父类。

addRelatedRecord() 方法
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来填充相关的对象。 此方法添加到此记录的相关的对象。

afterDelete() 方法
protected void afterDelete()
protected function afterDelete()
{
    if(
$this->hasEventHandler('onAfterDelete'))
        
$this->onAfterDelete(new CEvent($this));
}

删除记录之后调用此方法。 这个默认执行引发onAfterDelete事件。 您可以重写此方法,在记录被删除后做处理。 请确保您调用父实例,以便正确地引发该事件。

afterFind() 方法
protected void afterFind()
protected function afterFind()
{
    if(
$this->hasEventHandler('onAfterFind'))
        
$this->onAfterFind(new CEvent($this));
}

每个记录由 find 方法实例化后,将调用此方法。 这个默认执行引发onAfterFind事件。 你可以重写这个方法, 做处理后每个新查找的记录实例。 请确保您调用父实例,以便正确地引发该事件。

afterFindInternal() 方法
public void afterFindInternal()
public function afterFindInternal()
{
    
$this->afterFind();
}

调用afterFind。 这个方法内部使用。

afterSave() 方法
protected void afterSave()
protected function afterSave()
{
    if(
$this->hasEventHandler('onAfterSave'))
        
$this->onAfterSave(new CEvent($this));
}

记录被成功保存后,调用此方法。 这个默认执行引发onAfterSave事件。 您可重写此方法,以记录保存后做后处理。 请确保您调用父实例,以便正确地引发该事件。

applyScopes() 方法
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。

attributeNames() 方法
public array attributeNames()
{return} array 属性名称列表
public function attributeNames()
{
    return 
array_keys($this->getMetaData()->columns);
}

返回模型的所有属性名称的列表。 这将返回AR类与此相关联的所有表的列名。

beforeDelete() 方法
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事件。 您可以重写此方法,以做为记录删除任何准备工作。 请确保您调用父实例,以便正确地引发该事件。

beforeFind() 方法
protected void beforeFind()
protected function beforeFind()
{
    if(
$this->hasEventHandler('onBeforeFind'))
    {
        
$event=new CModelEvent($this);
        
// for backward compatibility
        
$event->criteria=func_num_args()>func_get_arg(0) : null;
        
$this->onBeforeFind($event);
    }
}

AR finder执行查找调用之前,将引发此事件。 查找调用包括findfindAllfindByPkfindAllByPkfindByAttributesfindAllByAttributes。 这个默认执行引发onBeforeFind事件。 如果重写此方法, 请确保您调用父实例,以便正确地引发该事件。

从1.1.5版本开始, 这种方法可称为一个隐藏的参数CDbCriteria表示当前查询条件传递到一个AR方法。

beforeFindInternal() 方法
public void beforeFindInternal()
public function beforeFindInternal()
{
    
$this->beforeFind();
}

调用beforeFind。 这个方法内部使用。

beforeSave() 方法
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 以确认是否是插入或保存记录。 请确保您调用父实例,以便正确地引发该事件。

cache() 方法 (可用自 v1.1.7)
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实例参数。

count() 方法
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。

countByAttributes() 方法 (可用自 v1.1.4)
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。

countBySql() 方法
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声明和参数。

defaultScope() 方法
public array defaultScope()
{return} array 查询条件。 这将作为CDbCriteria参数的构造方法。
public function defaultScope()
{
    return array();
}

返回默认的命名范围,应隐含这种模式适用于所有查询。 注意,默认的范围只适用于SELECT查询。忽视对INSERT,UPDATE和DELETE查询。 默认实现只返回一个空数组。 如果模型需要一些默认的标准(如只有活动记录,当返回)查询,你可以重写此方法。

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.'));
}

删除对应于此活动记录的行。

deleteAll() 方法
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。

deleteAllByAttributes() 方法
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。

deleteByPk() 方法
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。

equals() 方法
public boolean equals(CActiveRecord $record)
$record CActiveRecord 要比较的记录
{return} boolean 两个活动的记录是否是指数据库表中的同一行。
public function equals($record)
{
    return 
$this->tableName()===$record->tableName() && $this->getPrimaryKey()===$record->getPrimaryKey();
}

当前活动记录与另一个比较。 通过比较表名和两个活动记录的主键值来作比较。

exists() 方法
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。

find() 方法
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);
}

查找指定条件的单个活动记录。

findAll() 方法
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。

findAllByAttributes() 方法
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。

findAllByPk() 方法
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。

findAllBySql() 方法
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语句的所有活动记录。

findByAttributes() 方法
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。

findByPk() 方法
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。

findBySql() 方法
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语句的单个活动记录。

getActiveRelation() 方法
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类声明的命名关系。

getAttribute() 方法
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来获得属性值。

参见

getAttributeLabel() 方法 (可用自 v1.1.4)
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"中获得属性标签。

getAttributes() 方法
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;
}

返回所有列的属性值。 注意,不返回相关的对象。

getCommandBuilder() 方法
public CDbCommandBuilder getCommandBuilder()
{return} CDbCommandBuilder 这个命令生成器属于AR类
public function getCommandBuilder()
{
    return 
$this->getDbConnection()->getSchema()->getCommandBuilder();
}

返回此AR的命令生成器。

getDbConnection() 方法
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"应用程序组件用作数据库连接。 如果您要使用一个不同的数据库连接,您可以重写此方法。

getDbCriteria() 方法
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;
}

返回和这个模型相关的查询条件。

getIsNewRecord() 方法
public boolean getIsNewRecord()
{return} boolean 该记录是否是新的,就插入时调用save。 在构造函数和populateRecord自动设置此属性。 默认值为false, 如果使用new运算符创建实例,它会被设置为true。
public function getIsNewRecord()
{
    return 
$this->_new;
}

返回当前记录是否是新的。

getMetaData() 方法
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的元数据。

getOldPrimaryKey() 方法 (可用自 v1.1.0)
public mixed getOldPrimaryKey()
{return} mixed 旧的主键值。则返回数组(列名=>列值)如果主键是复合型。 If primary key is not defined, null will be returned.
public function getOldPrimaryKey()
{
    return 
$this->_pk;
}

返回旧的主键值。 这指的是主键值已填充到记录后, 执行查找方法 (例如: find(),findAll()), 即使主关键属性都会被手动分配一个不同的值,值保持不变。

getPrimaryKey() 方法
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;
}

返回主键值。

getRelated() 方法
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, 它返回一个对象数组或一个空数组。

getTableAlias() 方法 (可用自 v1.1.1)
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可以由应用的范围覆盖。

getTableSchema() 方法
public CDbTableSchema getTableSchema()
{return} CDbTableSchema 这个表的元数据属于AR类
public function getTableSchema()
{
    return 
$this->getMetaData()->tableSchema;
}

返回表的元数据,这属于AR类。

hasAttribute() 方法
public boolean hasAttribute(string $name)
$name string 属性名称
{return} boolean 这是否是AR命名的属性(table column).
public function hasAttribute($name)
{
    return isset(
$this->getMetaData()->columns[$name]);
}

检查此AR是否有命名的属性。

hasRelated() 方法
public boolean hasRelated(string $name)
$name string 关系名
{return} boolean 返回一个值指示是否命名相关对象被载入。
public function hasRelated($name)
{
    return isset(
$this->_related[$name]) || array_key_exists($name,$this->_related);
}

返回一个值,该值指示是否已加载命名的相关对象。

init() 方法
public void init()
public function init()
{
}

初始化这个模型。 当一个AR实例是新创建的或有它的scenario设置, 这个方法被触发。 您可以重写此方法以提供所需的初始化的代码模型 (例如:设置初始的属性值)。

insert() 方法
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’。

instantiate() 方法
protected CActiveRecord instantiate(array $attributes)
$attributes array 活动记录的属性值列表。
{return} CActiveRecord 活动记录
protected function instantiate($attributes)
{
    
$class=get_class($this);
    
$model=new $class(null);
    return 
$model;
}

创建活动记录实例。 这个方法调用populateRecordpopulateRecords。 如果正在创建的实例, 你可以重写此方法,取决于填充纪录的属性。 例如,通过创建基于列的值的记录, 你可以实现所谓的单表继承映射。

model() 方法
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);
}
offsetExists() 方法
public boolean offsetExists(mixed $offset)
$offset mixed 检查到的偏移量
{return} boolean
public function offsetExists($offset)
{
    return 
$this->__isset($offset);
}

返回是否有指定偏移量的元素。 这种方法需要接口ArrayAccess。

onAfterDelete() 方法
public void onAfterDelete(CEvent $event)
$event CEvent 事件参数
public function onAfterDelete($event)
{
    
$this->raiseEvent('onAfterDelete',$event);
}

在删除记录之后,将引发此事件。

onAfterFind() 方法
public void onAfterFind(CEvent $event)
$event CEvent 事件参数
public function onAfterFind($event)
{
    
$this->raiseEvent('onAfterFind',$event);
}

引发此事件记录后找到方法的实例。

onAfterSave() 方法
public void onAfterSave(CEvent $event)
$event CEvent 事件参数
public function onAfterSave($event)
{
    
$this->raiseEvent('onAfterSave',$event);
}

保存记录之后,将引发此事件。

onBeforeDelete() 方法
public void onBeforeDelete(CModelEvent $event)
$event CModelEvent 事件参数
public function onBeforeDelete($event)
{
    
$this->raiseEvent('onBeforeDelete',$event);
}

在删除记录之前,将引发此事件。 通过设置CModelEvent::isValid为false,正常delete()进程被停止。

onBeforeFind() 方法
public void onBeforeFind(CModelEvent $event)
$event CModelEvent 事件参数
public function onBeforeFind($event)
{
    
$this->raiseEvent('onBeforeFind',$event);
}

AR finder执行查找调用之前,将引发此事件。 在这种情况下,这CModelEvent::criteria个属性作为参数传递给此方法作为查询条件。 如果你要访问范围中指定的查询条件, 请使用getDbCriteria()。 你可以修改任何条件,根据需求定制。

参见

onBeforeSave() 方法
public void onBeforeSave(CModelEvent $event)
$event CModelEvent 事件参数
public function onBeforeSave($event)
{
    
$this->raiseEvent('onBeforeSave',$event);
}

保存记录之前,将引发此事件。 通过设置CModelEvent::isValid为false,正常save()进程被停止。

populateRecord() 方法
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 方法内部使用。

populateRecords() 方法
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 方法内部使用。

primaryKey() 方法
public mixed primaryKey()
{return} mixed 相关数据表的主键。 如果该键是一个单一的列,它应当返回列的名称; 如果键是由多个列组成的复合键, 它应该返回数组的键列名称。
public function primaryKey()
{
}

返回相关数据库表的主键。 这种方法是指表没有定义主键时(一些legency数据库)的情况下重写。 如果表已定义主键, 你不需要重写此方法。默认实现只返回null, 意思是返回在数据库中定义的主键。

query() 方法 (可用自 v1.1.7)
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 查询方法调用,主要是内部使用。

refresh() 方法
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;
}

最新的数据将被填充到这个活动记录。

refreshMetaData() 方法
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, 要不然,旧表的的数据结构仍被使用。

relations() 方法
public array relations()
{return} array 相关对象申明列表。 默认值为空数组。
public function 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'),
);
resetScope() 方法 (可用自 v1.1.2)
public CActiveRecord resetScope()
{return} CActiveRecord
public function resetScope()
{
    
$this->_c=new CDbCriteria();
    return 
$this;
}

重置所有变量作用域,包括默认的范围。

save() 方法
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’。 如果其主键是自动增量,并且在插入之前未设置, 将使用自动生成的值来填充主键。

saveAttributes() 方法
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,这个方法只保存现有的列数据集的指定的属性, 并且不调用beforeSaveafterSave。 请注意这个方法不过滤属性也不做验证。 所以不要这种方法接受不受信任的数据(如用户发布的数据)。 如果你想这样做,可以考虑以下方法代替:

$postRecord=Post::model()->findByPk($postID);
$postRecord->attributes=$_POST['post'];
$postRecord->save();
saveCounters() 方法 (可用自 v1.1.8)
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));
如果你想减少计数器,请使用负值。
scopes() 方法
public array scopes()
{return} array 范围的界定。数组中的键范围名称; 数组中的值是相应的范围定义。 每个范围定义被表示为一个数组,其键必须是CDbCriteria的属性。
public function scopes()
{
    return array();
}

返回申明的命名范围。 代表一个查询条件的命名范围,可以串连在一起与其他的命名范围和查询。 这种方法应该重写, 子类声明为特定的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();
需要注意的是最后一个查询是一个关联查询。
setAttribute() 方法
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来设置属性值。

参见

setDbCriteria() 方法 (可用自 v1.1.3)
public void setDbCriteria(CDbCriteria $criteria)
$criteria CDbCriteria 查询条件
public function setDbCriteria($criteria)
{
    
$this->_c=$criteria;
}

为当前模型设置查询条件.

setIsNewRecord() 方法
public void setIsNewRecord(boolean $value)
$value boolean 该记录是否是新的,就插入时调用save
public function setIsNewRecord($value)
{
    
$this->_new=$value;
}

设置记录是否是新的。

setOldPrimaryKey() 方法 (可用自 v1.1.3)
public void setOldPrimaryKey(mixed $value)
$value mixed 旧主键值。
public function setOldPrimaryKey($value)
{
    
$this->_pk=$value;
}

设置旧的主键值。

setPrimaryKey() 方法 (可用自 v1.1.0)
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得到。

setTableAlias() 方法 (可用自 v1.1.3)
public void setTableAlias(string $alias)
$alias string 在查询中使用表的别名。别名不应该加引号。
public function setTableAlias($alias)
{
    
$this->_alias=$alias;
}

设置表在查询中使用的别名。

tableName() 方法
public string tableName()
{return} string 返回表名
public function tableName()
{
    return 
get_class($this);
}

返回关联的数据库表的名称。 默认情况下,这个方法返回类名作为表名。 你可以覆盖这个方法,如果此列没有命名在这次约定之后。

together() 方法 (可用自 v1.1.4)
public CActiveRecord together()
{return} CActiveRecord AR对象本身。
public function together()
{
    
$this->getDbCriteria()->together=true;
    return 
$this;
}

设置CDbCriteria::together属性为true。 这只用于关系AR查询。 请参见CDbCriteria::together更多详细。

update() 方法
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执行验证。

updateAll() 方法
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。 注意,属性没有做安全检测和校验。

updateByPk() 方法
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。 注意,属性没有做安全检测和校验。

updateCounters() 方法
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。

参见

with() 方法
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();