4 位关注者

类 yii\db\ActiveRecord

继承yii\db\ActiveRecord » yii\db\BaseActiveRecord » yii\base\Model » yii\base\Component » yii\base\BaseObject
实现ArrayAccess, IteratorAggregate, yii\base\Arrayable, yii\base\Configurable, yii\base\StaticInstanceInterface, yii\db\ActiveRecordInterface
使用 Traityii\base\ArrayableTrait, yii\base\StaticInstanceTrait
自版本起可用2.0
源代码 https://github.com/yiisoft/yii2/blob/master/framework/db/ActiveRecord.php

ActiveRecord 是表示关系数据的类的基类,以对象的形式。

Active Record 实现了 Active Record 设计模式。Active Record 背后的前提是单个 yii\db\ActiveRecord 对象与数据库表中的特定行相关联。该对象 的属性映射到相应表的列。引用 Active Record 属性相当于访问该记录的对应表列。

例如,假设 Customer ActiveRecord 类与 customer 表相关联。这意味着该类的 name 属性自动映射到 customer 表中的 name 列。借助 Active Record,假设变量 $customerCustomer 类型的对象,要获取表行中 name 列的值,可以使用表达式 $customer->name。在这个例子中,Active Record 为访问存储在数据库中的数据提供了面向对象的接口。但 Active Record 提供的功能远不止这些。

要声明一个 ActiveRecord 类,您需要扩展 yii\db\ActiveRecord 并实现 tableName 方法

<?php

class Customer extends \yii\db\ActiveRecord
{
    public static function tableName()
    {
        return 'customer';
    }
}

tableName 方法只需要返回与该类关联的数据库表的名称。

提示:您还可以使用 Gii 代码生成器 从您的数据库表生成 ActiveRecord 类。

类实例可以通过以下两种方式获得

  • 使用 new 运算符创建新的空对象
  • 使用方法从数据库中获取现有记录(或记录集)

以下示例展示了 ActiveRecord 的一些典型用法

$user = new User();
$user->name = 'Qiang';
$user->save();  // a new row is inserted into user table

// the following will retrieve the user 'CeBe' from the database
$user = User::find()->where(['name' => 'CeBe'])->one();

// this will get related records from orders table when relation is defined
$orders = $user->orders;

有关 ActiveRecord 的更多详细信息和用法信息,请参阅 ActiveRecord 指南文章

公共属性

隐藏继承的属性

属性 类型 描述 由谁定义
$activeValidators yii\validators\Validator[] 适用于当前 $scenario 的验证器。 yii\base\Model
$attributes array 属性值(名称 => 值)。 yii\base\Model
$behaviors yii\base\Behavior[] 附加到此组件的行为列表。 yii\base\Component
$dirtyAttributes array 已更改的属性值(名称-值对)。 yii\db\BaseActiveRecord
$errors array 所有属性或指定属性的错误。 yii\base\Model
$firstErrors array 第一个错误。 yii\base\Model
$isNewRecord boolean 记录是否为新记录,在调用 save() 时应该插入。 yii\db\BaseActiveRecord
$iterator ArrayIterator 用于遍历列表中项目的迭代器。 yii\base\Model
$oldAttributes array 旧的属性值(名称-值对)。 yii\db\BaseActiveRecord
$oldPrimaryKey mixed 旧的主键值。 yii\db\BaseActiveRecord
$primaryKey mixed 主键值。 yii\db\BaseActiveRecord
$relatedRecords array 一个相关记录数组,按关系名称索引。 yii\db\BaseActiveRecord
$scenario string 此模型所处的场景。 yii\base\Model
$validators ArrayObject|yii\validators\Validator[] 模型中声明的所有验证器。 yii\base\Model

公共方法

隐藏继承的方法

方法 描述 由谁定义
__call() 调用不是类方法的命名方法。 yii\base\Component
__clone() 此方法在通过克隆现有对象创建对象后调用。 yii\base\Model
__construct() 构造函数。 yii\base\BaseObject
__get() PHP getter 魔术方法。 yii\db\BaseActiveRecord
__isset() 检查属性值是否为 null。 yii\db\BaseActiveRecord
__set() PHP setter 魔术方法。 yii\db\BaseActiveRecord
__unset() 将组件属性设置为 null。 yii\db\BaseActiveRecord
activeAttributes() 返回当前场景中受验证的属性名称列表。 yii\base\Model
addError() 向指定属性添加新的错误。 yii\base\Model
addErrors() 添加错误列表。 yii\base\Model
afterDelete() 此方法在删除记录后调用。 yii\db\BaseActiveRecord
afterFind() 当创建 AR 对象并使用查询结果填充它时,调用此方法。 yii\db\BaseActiveRecord
afterRefresh() 当刷新 AR 对象时,调用此方法。 yii\db\BaseActiveRecord
afterSave() 此方法在插入或更新记录结束时调用。 yii\db\BaseActiveRecord
afterValidate() 此方法在验证结束时调用。 yii\base\Model
attachBehavior() 将行为附加到此组件。 yii\base\Component
attachBehaviors() 将行为列表附加到组件。 yii\base\Component
attributeHints() 返回属性提示。 yii\base\Model
attributeLabels() 返回属性标签。 yii\base\Model
attributes() 返回模型的所有属性名称列表。 yii\db\ActiveRecord
beforeDelete() 此方法在删除记录之前调用。 yii\db\BaseActiveRecord
beforeSave() 此方法在插入或更新记录开始时调用。 yii\db\BaseActiveRecord
beforeValidate() 此方法在验证开始之前调用。 yii\base\Model
behaviors() 返回此组件应该表现的行为列表。 yii\base\Component
canGetProperty() 返回一个值,指示是否可以读取属性。 yii\db\BaseActiveRecord
canSetOldAttribute() 返回是否可以设置旧的命名属性。 yii\db\BaseActiveRecord
canSetProperty() 返回一个值,指示是否可以设置属性。 yii\db\BaseActiveRecord
className() 返回此类的完全限定名称。 yii\base\BaseObject
clearErrors() 删除所有属性或单个属性的错误。 yii\base\Model
createValidators() 根据 rules() 中指定的验证规则创建验证器对象。 yii\base\Model
delete() 删除与该活动记录对应的表行。 yii\db\ActiveRecord
deleteAll() 使用提供的条件删除表中的行。 yii\db\ActiveRecord
detachBehavior() 从组件中分离行为。 yii\base\Component
detachBehaviors() 从组件中分离所有行为。 yii\base\Component
ensureBehaviors() 确保 behaviors() 中声明的行为附加到此组件。 yii\base\Component
equals() 返回一个值,指示给定的活动记录是否与当前记录相同。 yii\db\ActiveRecord
extraFields() 返回可以进一步扩展并由 toArray() 返回的字段列表。 yii\base\ArrayableTrait
fields() 返回当未指定特定字段时,应由 toArray() 默认返回的字段列表。 yii\base\ArrayableTrait
find() 为查询目的创建 yii\db\ActiveQueryInterface 实例。 yii\db\ActiveRecord
findAll() 返回与指定主键值或一组列值匹配的活动记录模型列表。 yii\db\BaseActiveRecord
findBySql() 使用给定的 SQL 语句创建 yii\db\ActiveQuery 实例。 yii\db\ActiveRecord
findOne() 通过主键或一组列值返回单个活动记录模型实例。 yii\db\BaseActiveRecord
formName() 返回此模型类应使用的表单名称。 yii\base\Model
generateAttributeLabel() 根据给定的属性名称生成用户友好的属性标签。 yii\base\Model
getActiveValidators() 返回适用于当前 $scenario 的验证器。 yii\base\Model
getAttribute() 返回命名的属性值。 yii\db\BaseActiveRecord
getAttributeHint() 返回指定属性的文本提示。 yii\db\BaseActiveRecord
getAttributeLabel() 返回指定属性的文本标签。 yii\db\BaseActiveRecord
getAttributes() 返回属性值。 yii\base\Model
getBehavior() 返回命名的行为对象。 yii\base\Component
getBehaviors() 返回附加到此组件的所有行为。 yii\base\Component
getDb() 返回此 AR 类使用的数据库连接。 yii\db\ActiveRecord
getDirtyAttributes() 返回自它们最近加载或保存以来已修改的属性值。 yii\db\BaseActiveRecord
getErrorSummary() 将所有属性的错误作为一维数组返回。 yii\base\Model
getErrors() 返回所有属性或单个属性的错误。 yii\base\Model
getFirstError() 返回指定属性的第一个错误。 yii\base\Model
getFirstErrors() 返回模型中每个属性的第一个错误。 yii\base\Model
getIsNewRecord() 返回一个值,指示当前记录是否为新的。 yii\db\BaseActiveRecord
getIterator() 返回一个迭代器,用于遍历模型中的属性。 yii\base\Model
getOldAttribute() 返回命名的属性的旧值。 yii\db\BaseActiveRecord
getOldAttributes() 返回旧的属性值。 yii\db\BaseActiveRecord
getOldPrimaryKey() 返回旧的主键值。 yii\db\BaseActiveRecord
getPrimaryKey() 返回主键值。 yii\db\BaseActiveRecord
getRelatedRecords() 返回所有填充的关联记录。 yii\db\BaseActiveRecord
getRelation() 返回具有指定名称的关系对象。 yii\db\BaseActiveRecord
getScenario() 返回此模型所使用的场景。 yii\base\Model
getTableSchema() 返回与此 AR 类关联的 DB 表的模式信息。 yii\db\ActiveRecord
getValidators() 返回在 rules() 中声明的所有验证器。 yii\base\Model
hasAttribute() 返回一个值,指示模型是否具有具有指定名称的属性。 yii\db\BaseActiveRecord
hasErrors() 返回一个值,指示是否存在任何验证错误。 yii\base\Model
hasEventHandlers() 返回一个值,指示是否将任何处理程序附加到命名的事件。 yii\base\Component
hasMany() 有关更多信息,请参见 yii\db\BaseActiveRecord::hasMany() yii\db\ActiveRecord
hasMethod() 返回一个值,指示是否定义了方法。 yii\base\Component
hasOne() 有关更多信息,请参见 yii\db\BaseActiveRecord::hasOne() yii\db\ActiveRecord
hasProperty() 返回一个值,指示此组件是否定义了属性。 yii\base\Component
init() 初始化对象。 yii\db\BaseActiveRecord
insert() 使用此记录的属性值将一行插入到关联的数据库表中。 yii\db\ActiveRecord
instance() 返回静态类实例,可用于获取元信息。 yii\base\StaticInstanceTrait
instantiate() 创建一个活动记录实例。 yii\db\BaseActiveRecord
isAttributeActive() 返回一个值,指示属性在当前场景中是否处于活动状态。 yii\base\Model
isAttributeChanged() 返回一个值,指示命名的属性是否已更改。 yii\db\BaseActiveRecord
isAttributeRequired() 返回一个值,指示属性是否为必需的。 yii\base\Model
isAttributeSafe() 返回一个值,指示属性是否对大量分配安全。 yii\base\Model
isPrimaryKey() 返回一个值,指示给定的属性集是否代表此模型的主键。 yii\db\BaseActiveRecord
isRelationPopulated() 检查命名的关系是否已填充记录。 yii\db\BaseActiveRecord
isTransactional() 返回一个值,指示指定的操作在当前 $scenario 中是否为事务性的。 yii\db\ActiveRecord
link() 建立两个模型之间的关系。 yii\db\BaseActiveRecord
load() 使用输入数据填充模型。 yii\base\Model
loadDefaultValues() 从数据库表模式加载默认值。 yii\db\ActiveRecord
loadMultiple() 使用来自最终用户的數據填充一组模型。 yii\base\Model
loadRelations() 为已加载的主模型急切加载相关模型。 yii\db\BaseActiveRecord
loadRelationsFor() 为已加载的主模型急切加载相关模型。 yii\db\BaseActiveRecord
markAttributeDirty() 标记属性为脏属性。 yii\db\BaseActiveRecord
off() 从此组件分离现有的事件处理程序。 yii\base\Component
offsetExists() 返回在指定偏移量处是否存在元素。 yii\db\BaseActiveRecord
offsetGet() 返回指定偏移量处的元素。 yii\base\Model
offsetSet() 在指定偏移量处设置元素。 yii\base\Model
offsetUnset() 将指定偏移量处的元素值设置为 null。 yii\db\BaseActiveRecord
on() 将事件处理程序附加到事件。 yii\base\Component
onUnsafeAttribute() 当大量分配不安全的属性时,将调用此方法。 yii\base\Model
optimisticLock() 返回用于实现乐观锁定的列的名称,该列存储锁定版本。 yii\db\BaseActiveRecord
populateRecord() 使用来自数据库/存储的一行数据填充活动记录对象。 yii\db\ActiveRecord
populateRelation() 使用相关记录填充命名的关系。 yii\db\BaseActiveRecord
primaryKey() 返回此 AR 类的主键名称。 yii\db\ActiveRecord
refresh() 使用最新数据重新填充此活动记录。 yii\db\ActiveRecord
rules() 返回属性的验证规则。 yii\base\Model
safeAttributes() 返回在当前场景中可以大量分配的安全属性名称。 yii\base\Model
save() 保存当前记录。 yii\db\BaseActiveRecord
scenarios() 返回场景列表和相应的活动属性。 yii\base\Model
setAttribute() 设置命名的属性值。 yii\db\BaseActiveRecord
setAttributes() 以大量方式设置属性值。 yii\base\Model
setIsNewRecord() 设置指示记录是否为新的的值。 yii\db\BaseActiveRecord
setOldAttribute() 设置命名的属性的旧值。 yii\db\BaseActiveRecord
setOldAttributes() 设置旧的属性值。 yii\db\BaseActiveRecord
setScenario() 设置模型的场景。 yii\base\Model
tableName() 声明与此 AR 类关联的数据库表名称。 yii\db\ActiveRecord
toArray() 将模型转换为数组。 yii\base\ArrayableTrait
transactions() 声明应在不同场景中的事务中执行哪些 DB 操作。 yii\db\ActiveRecord
trigger() 触发事件。 yii\base\Component
unlink() 销毁两个模型之间的关系。 yii\db\BaseActiveRecord
unlinkAll() 销毁当前模型中的关系。 yii\db\BaseActiveRecord
update() 将对此活动记录的更改保存到关联的数据库表中。 yii\db\ActiveRecord
updateAll() 使用提供的属性值和条件更新整个表。 yii\db\ActiveRecord
updateAllCounters() 使用提供的计数器更改和条件更新整个表。 yii\db\ActiveRecord
updateAttributes() 更新指定的属性。 yii\db\BaseActiveRecord
updateCounters() 更新当前 AR 对象的一个或多个计数器列。 yii\db\BaseActiveRecord
validate() 执行数据验证。 yii\base\Model
validateMultiple() 验证多个模型。 yii\base\Model

受保护方法

隐藏继承的方法

方法 描述 由谁定义
createRelationQuery() has-onehas-many关系创建查询实例。 yii\db\BaseActiveRecord
deleteInternal() 删除活动记录,不考虑事务。 yii\db\ActiveRecord
extractFieldsFor() 从给定根字段的字段集合中提取嵌套字段。嵌套字段用点 (.) 分隔。例如: "item.id" 上面的示例将提取 "id"。 yii\base\ArrayableTrait
extractRootFields() 从嵌套字段中提取根字段名称。 yii\base\ArrayableTrait
insertInternal() 将活动记录插入到 DB 中,不考虑事务。 yii\db\ActiveRecord
refreshInternal() 使用新获取的实例重新填充此活动记录。 yii\db\BaseActiveRecord
resolveFields() 确定 toArray() 可以返回哪些字段。 yii\base\ArrayableTrait
updateInternal() yii\db\BaseActiveRecord

事件

隐藏继承的事件

事件 类型 描述 由谁定义
EVENT_AFTER_DELETE yii\db\Event 删除记录后触发的事件。 yii\db\BaseActiveRecord
EVENT_AFTER_FIND yii\db\Event 创建记录并填充查询结果后触发的事件。 yii\db\BaseActiveRecord
EVENT_AFTER_INSERT yii\db\AfterSaveEvent 插入记录后触发的事件。 yii\db\BaseActiveRecord
EVENT_AFTER_REFRESH yii\db\Event 刷新记录后触发的事件。(从版本 2.0.8 开始可用) yii\db\BaseActiveRecord
EVENT_AFTER_UPDATE yii\db\AfterSaveEvent 更新记录后触发的事件。 yii\db\BaseActiveRecord
EVENT_AFTER_VALIDATE yii\base\Event validate() 结束时引发的事件 yii\base\Model
EVENT_BEFORE_DELETE yii\base\ModelEvent 删除记录之前触发的事件。 yii\db\BaseActiveRecord
EVENT_BEFORE_INSERT yii\base\ModelEvent 插入记录之前触发的事件。 yii\db\BaseActiveRecord
EVENT_BEFORE_UPDATE yii\base\ModelEvent 更新记录之前触发的事件。 yii\db\BaseActiveRecord
EVENT_BEFORE_VALIDATE yii\base\ModelEvent validate() 开始时引发的事件。 yii\base\Model
EVENT_INIT yii\db\Event 通过 init() 初始化记录时触发的事件。 yii\db\BaseActiveRecord

常量

隐藏继承的常量

常量 描述 由谁定义
OP_ALL 0x7 所有三个操作:插入、更新、删除。这是表达式 OP_INSERT | OP_UPDATE | OP_DELETE 的快捷方式。 yii\db\ActiveRecord
OP_DELETE 0x4 删除操作。这主要用于覆盖 transactions() 以指定哪些操作是事务性的。 yii\db\ActiveRecord
OP_INSERT 0x1 插入操作。这主要用于覆盖 transactions() 以指定哪些操作是事务性的。 yii\db\ActiveRecord
OP_UPDATE 0x2 更新操作。这主要用于覆盖 transactions() 以指定哪些操作是事务性的。 yii\db\ActiveRecord
SCENARIO_DEFAULT 'default' 默认场景的名称。 yii\base\Model

方法详细信息

隐藏继承的方法

__call() public method

定义于: yii\base\Component::__call()

调用不是类方法的命名方法。

此方法将检查是否有任何附加的行为具有指定名称的方法,如果可用,则执行该方法。

不要直接调用此方法,因为它是一个 PHP 魔术方法,当调用未知方法时,它将被隐式调用。

public mixed __call ( $name, $params )
$name string

方法名称

$params array

方法参数

return mixed

方法返回值

抛出 yii\base\UnknownMethodException

调用未知方法时

                public function __call($name, $params)
{
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $object) {
        if ($object->hasMethod($name)) {
            return call_user_func_array([$object, $name], $params);
        }
    }
    throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}

            
__clone() 公共方法

定义在: yii\base\Model::__clone()

此方法在通过克隆现有对象创建对象后调用。

它会删除所有行为,因为它们附加在旧对象上。

public void __clone ( )

                public function __clone()
{
    parent::__clone();
    $this->_errors = null;
    $this->_validators = null;
}

            
__construct() 公共方法

定义在: yii\base\BaseObject::__construct()

构造函数。

默认实现做了两件事

  • 使用给定的配置$config初始化对象。
  • 调用init().

如果此方法在子类中被重写,建议

  • 构造函数的最后一个参数是一个配置数组,如这里所示的$config
  • 在构造函数的末尾调用父实现。
public void __construct ( $config = [] )
$config array

将用于初始化对象属性的名称-值对

                public function __construct($config = [])
{
    if (!empty($config)) {
        Yii::configure($this, $config);
    }
    $this->init();
}

            
__get() 公共方法

定义在: yii\db\BaseActiveRecord::__get()

PHP getter 魔术方法。

此方法被重写,以便属性和相关对象可以像属性一样访问。

另请参见getAttribute().

public mixed __get ( $name )
$name string

属性名称

return mixed

属性值

抛出 yii\base\InvalidArgumentException

如果关系名称错误

                public function __get($name)
{
    if (array_key_exists($name, $this->_attributes)) {
        return $this->_attributes[$name];
    }
    if ($this->hasAttribute($name)) {
        return null;
    }
    if (array_key_exists($name, $this->_related)) {
        return $this->_related[$name];
    }
    $value = parent::__get($name);
    if ($value instanceof ActiveQueryInterface) {
        $this->setRelationDependencies($name, $value);
        return $this->_related[$name] = $value->findFor($name, $this);
    }
    return $value;
}

            
__isset() 公共方法

定义在: yii\db\BaseActiveRecord::__isset()

检查属性值是否为 null。

此方法重写了父实现,通过检查命名的属性是否为null

public boolean __isset ( $name )
$name string

属性名称或事件名称

return boolean

属性值是否为null

                public function __isset($name)
{
    try {
        return $this->__get($name) !== null;
    } catch (\Exception $t) {
        return false;
    } catch (\Throwable $e) {
        return false;
    }
}

            
__set() 公共方法

定义在: yii\db\BaseActiveRecord::__set()

PHP setter 魔术方法。

此方法被重写,以便AR属性可以像属性一样访问。

public void __set ( $name, $value )
$name string

属性名称

$value mixed

属性值

                public function __set($name, $value)
{
    if ($this->hasAttribute($name)) {
        if (
            !empty($this->_relationsDependencies[$name])
            && (!array_key_exists($name, $this->_attributes) || $this->_attributes[$name] !== $value)
        ) {
            $this->resetDependentRelations($name);
        }
        $this->_attributes[$name] = $value;
    } else {
        parent::__set($name, $value);
    }
}

            
__unset() 公共方法

定义在: yii\db\BaseActiveRecord::__unset()

将组件属性设置为 null。

此方法重写了父实现,通过清除指定的属性值。

public void __unset ( $name )
$name string

属性名称或事件名称

                public function __unset($name)
{
    if ($this->hasAttribute($name)) {
        unset($this->_attributes[$name]);
        if (!empty($this->_relationsDependencies[$name])) {
            $this->resetDependentRelations($name);
        }
    } elseif (array_key_exists($name, $this->_related)) {
        unset($this->_related[$name]);
    } elseif ($this->getRelation($name, false) === null) {
        parent::__unset($name);
    }
}

            
activeAttributes() 公共方法

定义在: yii\base\Model::activeAttributes()

返回当前场景中受验证的属性名称列表。

public string[] activeAttributes ( )
return string[]

安全属性名称

                public function activeAttributes()
{
    $scenario = $this->getScenario();
    $scenarios = $this->scenarios();
    if (!isset($scenarios[$scenario])) {
        return [];
    }
    $attributes = array_keys(array_flip($scenarios[$scenario]));
    foreach ($attributes as $i => $attribute) {
        if (strncmp($attribute, '!', 1) === 0) {
            $attributes[$i] = substr($attribute, 1);
        }
    }
    return $attributes;
}

            
addError() 公共方法

定义在: yii\base\Model::addError()

向指定属性添加新的错误。

public void addError ( $attribute, $error '' )
$attribute string

属性名称

$error string

新的错误信息

                public function addError($attribute, $error = '')
{
    $this->_errors[$attribute][] = $error;
}

            
addErrors() 公共方法 (可用于版本 2.0.2)

定义在: yii\base\Model::addErrors()

添加错误列表。

public void addErrors ( array $items )
$items array

错误列表。数组键必须是属性名称。数组值应该是错误信息。如果属性有多个错误,这些错误必须以数组的形式给出。您可以使用getErrors()的结果作为此参数的值。

                public function addErrors(array $items)
{
    foreach ($items as $attribute => $errors) {
        if (is_array($errors)) {
            foreach ($errors as $error) {
                $this->addError($attribute, $error);
            }
        } else {
            $this->addError($attribute, $errors);
        }
    }
}

            
afterDelete() 公共方法

定义在: yii\db\BaseActiveRecord::afterDelete()

此方法在删除记录后调用。

默认实现会引发EVENT_AFTER_DELETE事件。您可以重写此方法以在记录被删除后执行后期处理。确保您调用父实现,以便事件正确触发。

public void afterDelete ( )

                public function afterDelete()
{
    $this->trigger(self::EVENT_AFTER_DELETE);
}

            
afterFind() 公共方法

定义在: yii\db\BaseActiveRecord::afterFind()

当创建 AR 对象并使用查询结果填充它时,调用此方法。

默认实现将触发EVENT_AFTER_FIND事件。重写此方法时,请确保调用父实现以确保事件被触发。

public void afterFind ( )

                public function afterFind()
{
    $this->trigger(self::EVENT_AFTER_FIND);
}

            
afterRefresh() 公共方法 (可用于版本 2.0.8)

定义在: yii\db\BaseActiveRecord::afterRefresh()

当刷新 AR 对象时,调用此方法。

默认实现将触发EVENT_AFTER_REFRESH事件。重写此方法时,请确保调用父实现以确保事件被触发。

public void afterRefresh ( )

                public function afterRefresh()
{
    $this->trigger(self::EVENT_AFTER_REFRESH);
}

            
afterSave() 公共方法

定义于: yii\db\BaseActiveRecord::afterSave()

此方法在插入或更新记录结束时调用。

默认实现将在 $inserttrue 时触发 EVENT_AFTER_INSERT 事件,或在 $insertfalse 时触发 EVENT_AFTER_UPDATE 事件。使用的事件类是 yii\db\AfterSaveEvent。在覆盖此方法时,请确保调用父级实现,以便触发事件。

public void afterSave ( $insert, $changedAttributes )
$insert boolean

此方法是在插入记录时调用的,还是在更新记录时调用的。如果为 false,则表示此方法是在更新记录时调用的。

$changedAttributes array

已更改并保存的属性的旧值。您可以使用此参数根据所做的更改采取行动,例如在密码更改时发送电子邮件或实现跟踪所有更改的审计跟踪。$changedAttributes 提供您旧的属性值,而活动记录 ($this) 已经具有新的更新后的值。

请注意,默认情况下不会执行自动类型转换。您可以使用 yii\behaviors\AttributeTypecastBehavior 来简化属性类型转换。请参阅 https://yiiframework.cn/doc-2.0/guide-db-active-record.html#attributes-typecasting

                public function afterSave($insert, $changedAttributes)
{
    $this->trigger($insert ? self::EVENT_AFTER_INSERT : self::EVENT_AFTER_UPDATE, new AfterSaveEvent([
        'changedAttributes' => $changedAttributes,
    ]));
}

            
afterValidate() 公共方法

定义于: yii\base\Model::afterValidate()

此方法在验证结束时调用。

默认实现会引发 afterValidate 事件。您可以覆盖此方法,在验证后进行后期处理。确保调用父级实现,以便可以引发事件。

public void afterValidate ( )

                public function afterValidate()
{
    $this->trigger(self::EVENT_AFTER_VALIDATE);
}

            
attachBehavior() 公共方法

定义于: yii\base\Component::attachBehavior()

将行为附加到此组件。

此方法将根据给定的配置创建行为对象。之后,行为对象将通过调用 yii\base\Behavior::attach() 方法附加到此组件。

另请参阅 detachBehavior()

public yii\base\Behavior attachBehavior ( $name, $behavior )
$name string

行为的名称。

$behavior string|array|yii\base\Behavior

行为配置。可以是以下之一

return yii\base\Behavior

行为对象

                public function attachBehavior($name, $behavior)
{
    $this->ensureBehaviors();
    return $this->attachBehaviorInternal($name, $behavior);
}

            
attachBehaviors() 公共方法

定义于: yii\base\Component::attachBehaviors()

将行为列表附加到组件。

每个行为都由其名称索引,并且应为 yii\base\Behavior 对象、指定行为类的字符串或用于创建行为的配置数组。

另请参阅 attachBehavior()

public void attachBehaviors ( $behaviors )
$behaviors array

要附加到组件的行为列表

                public function attachBehaviors($behaviors)
{
    $this->ensureBehaviors();
    foreach ($behaviors as $name => $behavior) {
        $this->attachBehaviorInternal($name, $behavior);
    }
}

            
attributeHints() 公共方法 (自版本 2.0.4 起可用)

定义于: yii\base\Model::attributeHints()

返回属性提示。

属性提示主要用于显示目的。例如,给定属性 isPublic,我们可以声明提示 Whether the post should be visible for not logged in users,它提供属性含义的用户友好描述,并且可以显示给最终用户。

与标签不同,如果省略了显式声明,则不会生成提示。

注意,为了继承父类中定义的提示,子类需要使用 array_merge() 等函数将父级提示与子级提示合并。

public array attributeHints ( )
return array

属性提示 (name => hint)

                public function attributeHints()
{
    return [];
}

            
attributeLabels() 公共方法

定义于: yii\base\Model::attributeLabels()

返回属性标签。

属性标签主要用于显示目的。例如,给定属性 firstName,我们可以声明标签 First Name,它更人性化,可以显示给最终用户。

默认情况下,属性标签使用 generateAttributeLabel() 生成。此方法允许您显式指定属性标签。

注意,为了继承父类中定义的标签,子类需要使用 array_merge() 等函数将父级标签与子级标签合并。

另请参阅 generateAttributeLabel()

public array attributeLabels ( )
return array

属性标签 (name => label)

                public function attributeLabels()
{
    return [];
}

            
attributes() 公共方法

返回模型的所有属性名称列表。

默认实现将返回与此 AR 类关联的表的 所有 列名。

public array attributes ( )
return array

属性名称列表。

                public function attributes()
{
    return static::getTableSchema()->getColumnNames();
}

            
beforeDelete() 公共方法

定义于: yii\db\BaseActiveRecord::beforeDelete()

此方法在删除记录之前调用。

默认实现会引发 EVENT_BEFORE_DELETE 事件。在覆盖此方法时,请确保像以下一样调用父级实现

public function beforeDelete()
{
    if (!parent::beforeDelete()) {
        return false;
    }

    // ...custom code here...
    return true;
}
public boolean beforeDelete ( )
return boolean

是否应该删除记录。默认为 true

                public function beforeDelete()
{
    $event = new ModelEvent();
    $this->trigger(self::EVENT_BEFORE_DELETE, $event);
    return $event->isValid;
}

            
beforeSave() 公共方法

定义于: yii\db\BaseActiveRecord::beforeSave()

此方法在插入或更新记录开始时调用。

默认实现将在 $inserttrue 时触发 EVENT_BEFORE_INSERT 事件,或在 $insertfalse 时触发 EVENT_BEFORE_UPDATE 事件。在覆盖此方法时,请确保像以下一样调用父级实现

public function beforeSave($insert)
{
    if (!parent::beforeSave($insert)) {
        return false;
    }

    // ...custom code here...
    return true;
}
public boolean beforeSave ( $insert )
$insert boolean

此方法是在插入记录时调用的,还是在更新记录时调用的。如果为 false,则表示此方法是在更新记录时调用的。

return boolean

是否应继续插入或更新。如果为 false,则插入或更新将被取消。

                public function beforeSave($insert)
{
    $event = new ModelEvent();
    $this->trigger($insert ? self::EVENT_BEFORE_INSERT : self::EVENT_BEFORE_UPDATE, $event);
    return $event->isValid;
}

            
beforeValidate() 公共方法

定义于: yii\base\Model::beforeValidate()

此方法在验证开始之前调用。

默认实现会引发 beforeValidate 事件。您可以覆盖此方法,在验证之前进行初步检查。确保调用父级实现,以便可以引发事件。

public boolean beforeValidate ( )
return boolean

是否执行验证。默认为 true。如果返回 false,验证将停止,模型将被视为无效。

                public function beforeValidate()
{
    $event = new ModelEvent();
    $this->trigger(self::EVENT_BEFORE_VALIDATE, $event);
    return $event->isValid;
}

            
behaviors() public method

定义于: yii\base\Component::behaviors()

返回此组件应该表现的行为列表。

子类可以重写此方法以指定他们希望表现为的行为。

此方法的返回值应为一个行为对象或配置数组,以行为名称作为索引。行为配置可以是指定行为类的字符串,也可以是以下结构的数组

'behaviorName' => [
    'class' => 'BehaviorClass',
    'property1' => 'value1',
    'property2' => 'value2',
]

请注意,行为类必须继承自 yii\base\Behavior。行为可以使用名称或匿名方式附加。当使用名称作为数组键时,使用此名称,行为可以稍后使用 getBehavior() 检索,或使用 detachBehavior() 分离。匿名行为无法检索或分离。

在此方法中声明的行为将自动附加到组件(按需)。

public array behaviors ( )
return array

行为配置。

                public function behaviors()
{
    return [];
}

            
canGetProperty() public method

定义于: yii\db\BaseActiveRecord::canGetProperty()

返回一个值,指示是否可以读取属性。

属性可以读取,如果

  • 类具有与指定名称关联的 getter 方法(在这种情况下,属性名称不区分大小写);
  • 类具有与指定名称相同的成员变量(当 $checkVars 为 true 时);
  • 附加的行为具有给定名称的可读属性(当 $checkBehaviors 为 true 时)。
public boolean canGetProperty ( $name, $checkVars true, $checkBehaviors true )
$name string

属性名称

$checkVars boolean

是否将成员变量视为属性

$checkBehaviors boolean

是否将行为的属性视为此组件的属性

return boolean

属性是否可读

                public function canGetProperty($name, $checkVars = true, $checkBehaviors = true)
{
    if (parent::canGetProperty($name, $checkVars, $checkBehaviors)) {
        return true;
    }
    try {
        return $this->hasAttribute($name);
    } catch (\Exception $e) {
        // `hasAttribute()` may fail on base/abstract classes in case automatic attribute list fetching used
        return false;
    }
}

            
canSetOldAttribute() public method

定义于: yii\db\BaseActiveRecord::canSetOldAttribute()

返回是否可以设置旧的命名属性。

另请参阅 setOldAttribute()

public boolean canSetOldAttribute ( $name )
$name string

属性名称

return boolean

旧属性是否可以设置

                public function canSetOldAttribute($name)
{
    return (isset($this->_oldAttributes[$name]) || $this->hasAttribute($name));
}

            
canSetProperty() public method

定义于: yii\db\BaseActiveRecord::canSetProperty()

返回一个值,指示是否可以设置属性。

属性可以写入,如果

  • 类具有与指定名称关联的 setter 方法(在这种情况下,属性名称不区分大小写);
  • 类具有与指定名称相同的成员变量(当 $checkVars 为 true 时);
  • 附加的行为具有给定名称的可写属性(当 $checkBehaviors 为 true 时)。
public boolean canSetProperty ( $name, $checkVars true, $checkBehaviors true )
$name string

属性名称

$checkVars boolean

是否将成员变量视为属性

$checkBehaviors boolean

是否将行为的属性视为此组件的属性

return boolean

属性是否可写

                public function canSetProperty($name, $checkVars = true, $checkBehaviors = true)
{
    if (parent::canSetProperty($name, $checkVars, $checkBehaviors)) {
        return true;
    }
    try {
        return $this->hasAttribute($name);
    } catch (\Exception $e) {
        // `hasAttribute()` may fail on base/abstract classes in case automatic attribute list fetching used
        return false;
    }
}

            
className() public static method
自 2.0.14 起弃用。在 PHP >= 5.5 上,使用 ::class 代替。

定义于: yii\base\BaseObject::className()

返回此类的完全限定名称。

public static string className ( )
return string

此类的完全限定名称。

                public static function className()
{
    return get_called_class();
}

            
clearErrors() public method

定义于: yii\base\Model::clearErrors()

删除所有属性或单个属性的错误。

public void clearErrors ( $attribute null )
$attribute string|null

属性名称。使用 null 删除所有属性的错误。

                public function clearErrors($attribute = null)
{
    if ($attribute === null) {
        $this->_errors = [];
    } else {
        unset($this->_errors[$attribute]);
    }
}

            
createRelationQuery() protected method (available since version 2.0.12)

定义于: yii\db\BaseActiveRecord::createRelationQuery()

has-onehas-many关系创建查询实例。

另请参阅

protected yii\db\ActiveQueryInterface createRelationQuery ( $class, $link, $multiple )
$class string

相关记录的类名。

$link array

主键-外键约束。

$multiple boolean

此查询是否表示与多条记录的关系。

return yii\db\ActiveQueryInterface

关系查询对象。

                protected function createRelationQuery($class, $link, $multiple)
{
    /* @var $class ActiveRecordInterface */
    /* @var $query ActiveQuery */
    $query = $class::find();
    $query->primaryModel = $this;
    $query->link = $link;
    $query->multiple = $multiple;
    return $query;
}

            
createValidators() public method

定义于: yii\base\Model::createValidators()

根据 rules() 中指定的验证规则创建验证器对象。

getValidators() 不同,每次调用此方法时,都会返回新的验证器列表。

public ArrayObject createValidators ( )
return ArrayObject

验证器

抛出 yii\base\InvalidConfigException

如果任何验证规则配置无效

                public function createValidators()
{
    $validators = new ArrayObject();
    foreach ($this->rules() as $rule) {
        if ($rule instanceof Validator) {
            $validators->append($rule);
        } elseif (is_array($rule) && isset($rule[0], $rule[1])) { // attributes, validator type
            $validator = Validator::createValidator($rule[1], $this, (array) $rule[0], array_slice($rule, 2));
            $validators->append($validator);
        } else {
            throw new InvalidConfigException('Invalid validation rule: a rule must specify both attribute names and validator type.');
        }
    }
    return $validators;
}

            
delete() public method

删除与该活动记录对应的表行。

此方法按顺序执行以下步骤

  1. 调用 beforeDelete()。如果方法返回 false,它将跳过其余步骤;
  2. 从数据库中删除记录;
  3. 调用 afterDelete()

在上面的步骤 1 和 3 中,事件名为 EVENT_BEFORE_DELETEEVENT_AFTER_DELETE 将由相应的方法触发。

public integer|false delete ( )
return integer|false

删除的行数,或 false,如果删除由于某种原因不成功。请注意,即使删除执行成功,删除的行数也可能为 0。

抛出 yii\db\StaleObjectException

如果启用了 乐观锁,并且要删除的数据已过时。

抛出 Throwable

如果删除失败。

                public function delete()
{
    if (!$this->isTransactional(self::OP_DELETE)) {
        return $this->deleteInternal();
    }
    $transaction = static::getDb()->beginTransaction();
    try {
        $result = $this->deleteInternal();
        if ($result === false) {
            $transaction->rollBack();
        } else {
            $transaction->commit();
        }
        return $result;
    } catch (\Exception $e) {
        $transaction->rollBack();
        throw $e;
    } catch (\Throwable $e) {
        $transaction->rollBack();
        throw $e;
    }
}

            
deleteAll() 公共静态方法

使用提供的条件删除表中的行。

例如,要删除所有状态为 3 的客户。

Customer::deleteAll('status = 3');

警告:如果您没有指定任何条件,此方法将删除表中的所有行。

请注意,此方法不会触发任何事件。如果您需要EVENT_BEFORE_DELETEEVENT_AFTER_DELETE被触发,您需要先find模型,然后在每个模型上调用delete()。例如,上面示例的等效代码为

$models = Customer::find()->where('status = 3')->all();
foreach ($models as $model) {
    $model->delete();
}

对于大量的模型,您可以考虑使用yii\db\ActiveQuery::each()来控制内存使用量。

public static integer deleteAll ( $condition null, $params = [] )
$condition string|array|null

将放到 DELETE SQL 语句 WHERE 部分的条件。请参考yii\db\Query::where()了解如何指定此参数。

$params array

要绑定到查询的参数(名称 => 值)。

return integer

已删除的行数。

                public static function deleteAll($condition = null, $params = [])
{
    $command = static::getDb()->createCommand();
    $command->delete(static::tableName(), $condition, $params);
    return $command->execute();
}

            
deleteInternal() 受保护方法

删除活动记录,不考虑事务。

protected integer|false deleteInternal ( )
return integer|false

删除的行数,或 false,如果删除由于某种原因不成功。请注意,即使删除执行成功,删除的行数也可能为 0。

抛出 yii\db\StaleObjectException

                protected function deleteInternal()
{
    if (!$this->beforeDelete()) {
        return false;
    }
    // we do not check the return value of deleteAll() because it's possible
    // the record is already deleted in the database and thus the method will return 0
    $condition = $this->getOldPrimaryKey(true);
    $lock = $this->optimisticLock();
    if ($lock !== null) {
        $condition[$lock] = $this->$lock;
    }
    $result = static::deleteAll($condition);
    if ($lock !== null && !$result) {
        throw new StaleObjectException('The object being deleted is outdated.');
    }
    $this->setOldAttributes(null);
    $this->afterDelete();
    return $result;
}

            
detachBehavior() 公共方法

定义于:yii\base\Component::detachBehavior()

从组件中分离行为。

将调用行为的yii\base\Behavior::detach()方法。

public yii\base\Behavior|null detachBehavior ( $name )
$name string

行为的名称。

return yii\base\Behavior|null

已分离的行为。如果行为不存在,则为 null。

                public function detachBehavior($name)
{
    $this->ensureBehaviors();
    if (isset($this->_behaviors[$name])) {
        $behavior = $this->_behaviors[$name];
        unset($this->_behaviors[$name]);
        $behavior->detach();
        return $behavior;
    }
    return null;
}

            
detachBehaviors() 公共方法

定义于:yii\base\Component::detachBehaviors()

从组件中分离所有行为。

public void detachBehaviors ( )

                public function detachBehaviors()
{
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $name => $behavior) {
        $this->detachBehavior($name);
    }
}

            
ensureBehaviors() 公共方法

定义于:yii\base\Component::ensureBehaviors()

确保 behaviors() 中声明的行为附加到此组件。

public void ensureBehaviors ( )

                public function ensureBehaviors()
{
    if ($this->_behaviors === null) {
        $this->_behaviors = [];
        foreach ($this->behaviors() as $name => $behavior) {
            $this->attachBehaviorInternal($name, $behavior);
        }
    }
}

            
equals() 公共方法

返回一个值,指示给定的活动记录是否与当前记录相同。

比较是通过比较两个活动记录的表名和主键值来完成的。如果其中一个记录是新的,它们也被认为是不相等的。

public boolean equals ( $record )
$record yii\db\ActiveRecord

要比较的记录

return boolean

两个活动记录是否引用同一个数据库表中的同一行。

                public function equals($record)
{
    if ($this->isNewRecord || $record->isNewRecord) {
        return false;
    }
    return static::tableName() === $record->tableName() && $this->getPrimaryKey() === $record->getPrimaryKey();
}

            
extraFields() 公共方法

定义于:yii\base\ArrayableTrait::extraFields()

返回可以进一步扩展并由 toArray() 返回的字段列表。

此方法类似于fields(),不同之处在于此方法返回的字段列表默认情况下不会被toArray()返回。只有在调用toArray()时显式指定要扩展的字段名时,才会导出它们的值。

默认实现返回一个空数组。

您可以覆盖此方法,根据一些上下文信息(例如当前应用程序用户)返回可扩展字段的列表。

另请参阅

public array extraFields ( )
return array

可扩展字段名或字段定义的列表。请参考fields()了解返回值的格式。

                public function extraFields()
{
    return [];
}

            
extractFieldsFor() 受保护方法 (版本 2.0.14 起可用)

定义于:yii\base\ArrayableTrait::extractFieldsFor()

从给定根字段的字段集合中提取嵌套字段。嵌套字段用点 (.) 分隔。例如: "item.id" 上面的示例将提取 "id"。

protected array extractFieldsFor ( array $fields, $rootField )
$fields array

请求提取的字段

$rootField string

我们想要提取嵌套字段的根字段

return array

为给定字段提取的嵌套字段

                protected function extractFieldsFor(array $fields, $rootField)
{
    $result = [];
    foreach ($fields as $field) {
        if (0 === strpos($field, "{$rootField}.")) {
            $result[] = preg_replace('/^' . preg_quote($rootField, '/') . '\./i', '', $field);
        }
    }
    return array_unique($result);
}

            
extractRootFields() 受保护方法 (版本 2.0.14 起可用)

定义于:yii\base\ArrayableTrait::extractRootFields()

从嵌套字段中提取根字段名称。

嵌套字段用点 (.) 分隔。例如: "item.id" 上面的示例将提取 "item"。

protected array extractRootFields ( array $fields )
$fields array

请求提取的字段

return array

从给定嵌套字段中提取的根字段

                protected function extractRootFields(array $fields)
{
    $result = [];
    foreach ($fields as $field) {
        $result[] = current(explode('.', $field, 2));
    }
    if (in_array('*', $result, true)) {
        $result = [];
    }
    return array_unique($result);
}

            
fields() 公共方法

定义于:yii\base\ArrayableTrait::fields()

返回当未指定特定字段时,应由 toArray() 默认返回的字段列表。

字段是toArray()返回的数组中的命名元素。

此方法应该返回一个字段名或字段定义的数组。如果是前者,字段名将被视为对象的属性名,其值将用作字段值。如果是后者,数组键应该是字段名,而数组值应该是相应的字段定义,它可以是对象的属性名,也可以是返回相应字段值的 PHP 可调用函数。可调用函数的签名应该是

function ($model, $field) {
    // return field value
}

例如,以下代码声明了四个字段

  • email:字段名与属性名 email 相同;
  • firstNamelastName:字段名是 firstNamelastName,它们的值来自 first_namelast_name 属性;
  • fullName:字段名是 fullName。它的值通过连接 first_namelast_name 获得。
return [
    'email',
    'firstName' => 'first_name',
    'lastName' => 'last_name',
    'fullName' => function () {
        return $this->first_name . ' ' . $this->last_name;
    },
];

在此方法中,您可能还想根据一些上下文信息返回不同的字段列表。例如,根据当前应用程序用户的权限,您可以返回不同的可见字段集或过滤掉一些字段。

此方法的默认实现返回由它们自己索引的公共对象成员变量。

另请参阅toArray()

public array fields ( )
return array

字段名或字段定义的列表。

                public function fields()
{
    $fields = array_keys(Yii::getObjectVars($this));
    return array_combine($fields, $fields);
}

            
find() 公共静态方法

为查询目的创建 yii\db\ActiveQueryInterface 实例。

返回的 yii\db\ActiveQueryInterface 实例可以通过调用 yii\db\ActiveQueryInterface 中定义的方法来进一步定制,在调用 one()all() 返回填充的 ActiveRecord 实例之前。例如,

// find the customer whose ID is 1
$customer = Customer::find()->where(['id' => 1])->one();

// find all active customers and order them by their age:
$customers = Customer::find()
    ->where(['status' => 1])
    ->orderBy('age')
    ->all();

此方法也被 yii\db\BaseActiveRecord::hasOne()yii\db\BaseActiveRecord::hasMany() 调用来创建关系查询。

您可以重写此方法以返回自定义查询。例如,

class Customer extends ActiveRecord
{
    public static function find()
    {
        // use CustomerQuery instead of the default ActiveQuery
        return new CustomerQuery(get_called_class());
    }
}

以下代码展示了如何为所有查询应用默认条件

class Customer extends ActiveRecord
{
    public static function find()
    {
        return parent::find()->where(['deleted' => false]);
    }
}

// Use andWhere()/orWhere() to apply the default condition
// SELECT FROM customer WHERE `deleted`=:deleted AND age>30
$customers = Customer::find()->andWhere('age>30')->all();

// Use where() to ignore the default condition
// SELECT FROM customer WHERE age>30
$customers = Customer::find()->where('age>30')->all();
public static yii\db\ActiveQuery find ( )
return yii\db\ActiveQuery

新创建的 yii\db\ActiveQuery 实例。

                public static function find()
{
    return Yii::createObject(ActiveQuery::className(), [get_called_class()]);
}

            
findAll() 公共静态方法

定义于: yii\db\BaseActiveRecord::findAll()

返回与指定主键值或一组列值匹配的活动记录模型列表。

该方法接受

  • 一个标量值(整数或字符串):通过单个主键值查询并返回包含相应记录的数组(如果未找到则返回空数组)。
  • 一个非关联数组:通过主键值的列表查询并返回相应的记录(如果未找到则返回空数组)。请注意,空条件将导致空结果,因为它将被解释为对主键的搜索,而不是空的 WHERE 条件。
  • 一个名称-值对的关联数组:通过一组属性值查询并返回匹配所有属性值的记录数组(如果未找到则返回空数组)。请注意,['id' => 1, 2] 被视为非关联数组。对于 SQL DBMS,列名限制为当前记录表的列,或者以其他方式过滤以限制为简单的过滤条件。
  • 一个 yii\db\Expression:表达式将直接使用。(@since 2.0.37)

此方法将自动调用 all() 方法并返回一个 ActiveRecord 实例数组。

注意: 由于这只是一个简写方法,因此使用更复杂的条件(例如 ['!=', 'id', 1])将不起作用。如果您需要指定更复杂的条件,请使用 find()where() 结合使用。

查看以下代码以了解用法示例

// find the customers whose primary key value is 10
$customers = Customer::findAll(10);

// the above code is equivalent to:
$customers = Customer::find()->where(['id' => 10])->all();

// find the customers whose primary key value is 10, 11 or 12.
$customers = Customer::findAll([10, 11, 12]);

// the above code is equivalent to:
$customers = Customer::find()->where(['id' => [10, 11, 12]])->all();

// find customers whose age is 30 and whose status is 1
$customers = Customer::findAll(['age' => 30, 'status' => 1]);

// the above code is equivalent to:
$customers = Customer::find()->where(['age' => 30, 'status' => 1])->all();

如果您需要将用户输入传递给此方法,请确保输入值为标量,或者在数组条件的情况下,请确保数组结构无法从外部更改。

// yii\web\Controller ensures that $id is scalar
public function actionView($id)
{
    $model = Post::findOne($id);
    // ...
}

// explicitly specifying the colum to search, passing a scalar or array here will always result in finding a single record
$model = Post::findOne(['id' => Yii::$app->request->get('id')]);

// do NOT use the following code! it is possible to inject an array condition to filter by arbitrary column values!
$model = Post::findOne(Yii::$app->request->get('id'));
public static static[] findAll ( $condition )
$condition mixed

主键值或一组列值

return yii\db\BaseActiveRecord[]

一个 ActiveRecord 实例数组,或者如果没有任何匹配则为空数组。

                public static function findAll($condition)
{
    return static::findByCondition($condition)->all();
}

            
findBySql() 公共静态方法

使用给定的 SQL 语句创建 yii\db\ActiveQuery 实例。

请注意,由于 SQL 语句已经指定,因此在创建的 yii\db\ActiveQuery 实例上调用额外的查询修改方法(如 where()order())将不起作用。但是,调用 with()asArray()indexBy() 仍然是可以的。

以下是一个示例

$customers = Customer::findBySql('SELECT * FROM customer')->all();
public static yii\db\ActiveQuery findBySql ( $sql, $params = [] )
$sql string

要执行的 SQL 语句

$params array

要在执行期间绑定到 SQL 语句的参数。

return yii\db\ActiveQuery

新创建的 yii\db\ActiveQuery 实例

                public static function findBySql($sql, $params = [])
{
    $query = static::find();
    $query->sql = $sql;
    return $query->params($params);
}

            
findOne() 公共静态方法

定义于: yii\db\BaseActiveRecord::findOne()

通过主键或一组列值返回单个活动记录模型实例。

该方法接受

  • 一个标量值(整数或字符串):通过单个主键值查询并返回包含相应记录的数组(如果未找到则返回 null)。
  • 一个非关联数组:通过主键值的列表查询并返回第一条记录(如果未找到则返回 null)。
  • 一个名称-值对的关联数组:通过一组属性值查询并返回匹配所有属性值的单条记录(如果未找到则返回 null)。请注意,['id' => 1, 2] 被视为非关联数组。列名限制为当前记录表的列,或者以其他方式过滤以限制为简单的过滤条件。
  • 一个 yii\db\Expression:表达式将直接使用。(@since 2.0.37)

此方法将自动调用 one() 方法并返回一个 ActiveRecord 实例。

注意: 由于这只是一个简写方法,因此使用更复杂的条件(例如 ['!=', 'id', 1])将不起作用。如果您需要指定更复杂的条件,请使用 find()where() 结合使用。

查看以下代码以了解用法示例

// find a single customer whose primary key value is 10
$customer = Customer::findOne(10);

// the above code is equivalent to:
$customer = Customer::find()->where(['id' => 10])->one();

// find the customers whose primary key value is 10, 11 or 12.
$customers = Customer::findOne([10, 11, 12]);

// the above code is equivalent to:
$customers = Customer::find()->where(['id' => [10, 11, 12]])->one();

// find the first customer whose age is 30 and whose status is 1
$customer = Customer::findOne(['age' => 30, 'status' => 1]);

// the above code is equivalent to:
$customer = Customer::find()->where(['age' => 30, 'status' => 1])->one();

如果您需要将用户输入传递给此方法,请确保输入值为标量,或者在数组条件的情况下,请确保数组结构无法从外部更改。

// yii\web\Controller ensures that $id is scalar
public function actionView($id)
{
    $model = Post::findOne($id);
    // ...
}

// explicitly specifying the colum to search, passing a scalar or array here will always result in finding a single record
$model = Post::findOne(['id' => Yii::$app->request->get('id')]);

// do NOT use the following code! it is possible to inject an array condition to filter by arbitrary column values!
$model = Post::findOne(Yii::$app->request->get('id'));
public static static|null findOne ( $condition )
$condition mixed

主键值或一组列值

return yii\db\BaseActiveRecord|null

与条件匹配的 ActiveRecord 实例,或者如果没有任何匹配则为 null

                public static function findOne($condition)
{
    return static::findByCondition($condition)->one();
}

            
formName() 公共方法

定义于: yii\base\Model::formName()

返回此模型类应使用的表单名称。

表单名称主要由 yii\widgets\ActiveForm 用于确定如何为模型中的属性命名输入字段。如果表单名称为“A”,属性名称为“b”,则相应的输入名称将为“A[b]”。如果表单名称为空字符串,则输入名称将为“b”。

上述命名方案的目的是,对于包含多个不同模型的表单,每个模型的属性被分组在 POST 数据的子数组中,并且更容易区分它们。

默认情况下,此方法返回模型类名(不包括命名空间部分)作为表单名称。当模型在不同的表单中使用时,您可以重写它。

另请参阅 load()

public string formName ( )
return string

此模型类的表单名称。

抛出 yii\base\InvalidConfigException

当表单使用匿名类定义并且 formName() 方法未被重写时。

                public function formName()
{
    $reflector = new ReflectionClass($this);
    if (PHP_VERSION_ID >= 70000 && $reflector->isAnonymous()) {
        throw new InvalidConfigException('The "formName()" method should be explicitly defined for anonymous models');
    }
    return $reflector->getShortName();
}

            
generateAttributeLabel() 公共方法

定义于: yii\base\Model::generateAttributeLabel()

根据给定的属性名称生成用户友好的属性标签。

这是通过将下划线、破折号和点替换为空白,并将每个单词的第一个字母更改为大写来完成的。例如,“department_name”或“DepartmentName”将生成“Department Name”。

public string generateAttributeLabel ( $name )
$name string

列名

return string

属性标签

                public function generateAttributeLabel($name)
{
    return Inflector::camel2words($name, true);
}

            
getActiveValidators() 公共方法

定义于: yii\base\Model::getActiveValidators()

返回适用于当前 $scenario 的验证器。

public yii\validators\Validator[] getActiveValidators ( $attribute null )
$attribute string|null

要返回其适用验证器的属性的名称。如果为 null,则将返回模型中所有属性的验证器。

return yii\validators\Validator[]

适用于当前 $scenario 的验证器。

                public function getActiveValidators($attribute = null)
{
    $activeAttributes = $this->activeAttributes();
    if ($attribute !== null && !in_array($attribute, $activeAttributes, true)) {
        return [];
    }
    $scenario = $this->getScenario();
    $validators = [];
    foreach ($this->getValidators() as $validator) {
        if ($attribute === null) {
            $validatorAttributes = $validator->getValidationAttributes($activeAttributes);
            $attributeValid = !empty($validatorAttributes);
        } else {
            $attributeValid = in_array($attribute, $validator->getValidationAttributes($attribute), true);
        }
        if ($attributeValid && $validator->isActive($scenario)) {
            $validators[] = $validator;
        }
    }
    return $validators;
}

            
getAttribute() 公共方法

定义于: yii\db\BaseActiveRecord::getAttribute()

返回命名的属性值。

如果此记录是查询的结果且属性未加载,则将返回 null

另请参见 hasAttribute()

public mixed getAttribute ( $name )
$name string

属性名称

return mixed

属性值。如果属性未设置或不存在,则为 null

                public function getAttribute($name)
{
    return isset($this->_attributes[$name]) ? $this->_attributes[$name] : null;
}

            
getAttributeHint() 公共方法 (自版本 2.0.4 起可用)

定义于: yii\db\BaseActiveRecord::getAttributeHint()

返回指定属性的文本提示。

如果属性类似于 relatedModel.attribute,则属性将从关联模型接收。

另请参见 attributeHints()

public string getAttributeHint ( $attribute )
$attribute string

属性名称

return string

属性提示

                public function getAttributeHint($attribute)
{
    $hints = $this->attributeHints();
    if (isset($hints[$attribute])) {
        return $hints[$attribute];
    } elseif (strpos($attribute, '.')) {
        $attributeParts = explode('.', $attribute);
        $neededAttribute = array_pop($attributeParts);
        $relatedModel = $this;
        foreach ($attributeParts as $relationName) {
            if ($relatedModel->isRelationPopulated($relationName) && $relatedModel->$relationName instanceof self) {
                $relatedModel = $relatedModel->$relationName;
            } else {
                try {
                    $relation = $relatedModel->getRelation($relationName);
                } catch (InvalidParamException $e) {
                    return '';
                }
                /* @var $modelClass ActiveRecordInterface */
                $modelClass = $relation->modelClass;
                $relatedModel = $modelClass::instance();
            }
        }
        $hints = $relatedModel->attributeHints();
        if (isset($hints[$neededAttribute])) {
            return $hints[$neededAttribute];
        }
    }
    return '';
}

            
getAttributeLabel() 公共方法

定义于: yii\db\BaseActiveRecord::getAttributeLabel()

返回指定属性的文本标签。

属性可以以点格式指定,以从关联模型检索标签或允许此模型覆盖关联模型中定义的标签。例如,如果属性被指定为 'relatedModel1.relatedModel2.attr',该函数将按以下顺序返回它可以找到的第一个标签定义

  • 在此模型的 attributeLabels() 中定义的 'relatedModel1.relatedModel2.attr' 的标签;
  • 在此模型的关系 'relatedModel1' 所表示的关联模型中定义的 'relatedModel2.attr' 的标签;
  • 在关系 'relatedModel1' 的关系 'relatedModel2' 所表示的关联模型中定义的 'attr' 的标签。如果没有找到标签定义,则将返回 $this->generateAttributeLabel('relatedModel1.relatedModel2.attr') 的值。

另请参阅

public string getAttributeLabel ( $attribute )
$attribute string

属性名称

return string

属性标签

                public function getAttributeLabel($attribute)
{
    $model = $this;
    $modelAttribute = $attribute;
    for (;;) {
        $labels = $model->attributeLabels();
        if (isset($labels[$modelAttribute])) {
            return $labels[$modelAttribute];
        }
        $parts = explode('.', $modelAttribute, 2);
        if (count($parts) < 2) {
            break;
        }
        list ($relationName, $modelAttribute) = $parts;
        if ($model->isRelationPopulated($relationName) && $model->$relationName instanceof self) {
            $model = $model->$relationName;
        } else {
            try {
                $relation = $model->getRelation($relationName);
            } catch (InvalidArgumentException $e) {
                break;
            }
            /* @var $modelClass ActiveRecordInterface */
            $modelClass = $relation->modelClass;
            $model = $modelClass::instance();
        }
    }
    return $this->generateAttributeLabel($attribute);
}

            
getAttributes() 公共方法

定义于: yii\base\Model::getAttributes()

返回属性值。

public array getAttributes ( $names null, $except = [] )
$names array|null

需要返回值的属性列表。默认为 null,表示将返回 attributes() 中列出的所有属性。如果它是一个数组,则只返回数组中的属性。

$except array

不应返回值的属性列表。

return array

属性值(名称 => 值)。

                public function getAttributes($names = null, $except = [])
{
    $values = [];
    if ($names === null) {
        $names = $this->attributes();
    }
    foreach ($names as $name) {
        $values[$name] = $this->$name;
    }
    foreach ($except as $name) {
        unset($values[$name]);
    }
    return $values;
}

            
getBehavior() 公共方法

定义于: yii\base\Component::getBehavior()

返回命名的行为对象。

public yii\base\Behavior|null getBehavior ( $name )
$name string

行为名称

return yii\base\Behavior|null

行为对象,如果行为不存在,则为 null

                public function getBehavior($name)
{
    $this->ensureBehaviors();
    return isset($this->_behaviors[$name]) ? $this->_behaviors[$name] : null;
}

            
getBehaviors() 公共方法

定义于: yii\base\Component::getBehaviors()

返回附加到此组件的所有行为。

public yii\base\Behavior[] getBehaviors ( )
return yii\base\Behavior[]

附加到此组件的行为列表

                public function getBehaviors()
{
    $this->ensureBehaviors();
    return $this->_behaviors;
}

            
getDb() 公共静态方法

返回此 AR 类使用的数据库连接。

默认情况下,"db" 应用程序组件用作数据库连接。如果您想使用其他数据库连接,可以覆盖此方法。

public static yii\db\Connection getDb ( )
return yii\db\Connection

此 AR 类使用的数据库连接。

                public static function getDb()
{
    return Yii::$app->getDb();
}

            
getDirtyAttributes() 公共方法

定义于: yii\db\BaseActiveRecord::getDirtyAttributes()

返回自它们最近加载或保存以来已修改的属性值。

使用 === 对新旧值进行比较。

public array getDirtyAttributes ( $names null )
$names string[]|null

如果属性的值最近发生了更改,则可能返回这些属性的名称。如果为 null,则将使用 attributes()

return array

已更改的属性值(名称-值对)

                public function getDirtyAttributes($names = null)
{
    if ($names === null) {
        $names = $this->attributes();
    }
    $names = array_flip($names);
    $attributes = [];
    if ($this->_oldAttributes === null) {
        foreach ($this->_attributes as $name => $value) {
            if (isset($names[$name])) {
                $attributes[$name] = $value;
            }
        }
    } else {
        foreach ($this->_attributes as $name => $value) {
            if (isset($names[$name]) && (!array_key_exists($name, $this->_oldAttributes) || $this->isValueDifferent($value, $this->_oldAttributes[$name]))) {
                $attributes[$name] = $value;
            }
        }
    }
    return $attributes;
}

            
getErrorSummary() 公共方法 (自版本 2.0.14 起可用)

定义于: yii\base\Model::getErrorSummary()

将所有属性的错误作为一维数组返回。

另请参阅

public array getErrorSummary ( $showAllErrors )
$showAllErrors boolean

布尔值,如果设置为 true,则将显示每个属性的每个错误消息,否则仅显示每个属性的第一个错误消息。

return array

所有属性的错误,作为一维数组。如果没有错误,则返回空数组。

                public function getErrorSummary($showAllErrors)
{
    $lines = [];
    $errors = $showAllErrors ? $this->getErrors() : $this->getFirstErrors();
    foreach ($errors as $es) {
        $lines = array_merge($lines, (array)$es);
    }
    return $lines;
}

            
getErrors() 公共方法

定义于: yii\base\Model::getErrors()

返回所有属性或单个属性的错误。

另请参阅

public array getErrors ( $attribute null )
$attribute string|null

属性名称。使用 null 获取所有属性的错误。

return array

所有属性或指定属性的错误。如果没有错误,则返回空数组。有关详细说明,请参见 getErrors()。请注意,在返回所有属性的错误时,结果是一个二维数组,如下所示

[
    'username' => [
        'Username is required.',
        'Username must contain only word characters.',
    ],
    'email' => [
        'Email address is invalid.',
    ]
]

                public function getErrors($attribute = null)
{
    if ($attribute === null) {
        return $this->_errors === null ? [] : $this->_errors;
    }
    return isset($this->_errors[$attribute]) ? $this->_errors[$attribute] : [];
}

            
getFirstError() 公共方法

定义于: yii\base\Model::getFirstError()

返回指定属性的第一个错误。

另请参阅

public string|null getFirstError ( $attribute )
$attribute string

属性名称。

return string|null

错误消息。如果没有错误,则返回 null。

                public function getFirstError($attribute)
{
    return isset($this->_errors[$attribute]) ? reset($this->_errors[$attribute]) : null;
}

            
getFirstErrors() 公共方法

定义于: yii\base\Model::getFirstErrors()

返回模型中每个属性的第一个错误。

另请参阅

public array getFirstErrors ( )
return array

第一个错误。数组键是属性名称,数组值是对应的错误信息。如果无错误,则返回空数组。

                public function getFirstErrors()
{
    if (empty($this->_errors)) {
        return [];
    }
    $errors = [];
    foreach ($this->_errors as $name => $es) {
        if (!empty($es)) {
            $errors[$name] = reset($es);
        }
    }
    return $errors;
}

            
getIsNewRecord() public method

定义于: yii\db\BaseActiveRecord::getIsNewRecord()

返回一个值,指示当前记录是否为新的。

public boolean getIsNewRecord ( )
return boolean

记录是否为新记录,在调用 save() 时应该插入。

                public function getIsNewRecord()
{
    return $this->_oldAttributes === null;
}

            
getIterator() public method

定义于: yii\base\Model::getIterator()

返回一个迭代器,用于遍历模型中的属性。

此方法是接口 IteratorAggregate 所需。

public ArrayIterator getIterator ( )
return ArrayIterator

用于遍历列表中项目的迭代器。

                #[\ReturnTypeWillChange]
public function getIterator()
{
    $attributes = $this->getAttributes();
    return new ArrayIterator($attributes);
}

            
getOldAttribute() public method

定义于: yii\db\BaseActiveRecord::getOldAttribute()

返回命名的属性的旧值。

如果此记录是查询的结果且属性未加载,则将返回 null

另请参见 hasAttribute()

public mixed getOldAttribute ( $name )
$name string

属性名称

return mixed

旧属性值。如果属性之前未加载或不存在,则为 null

                public function getOldAttribute($name)
{
    return isset($this->_oldAttributes[$name]) ? $this->_oldAttributes[$name] : null;
}

            
getOldAttributes() public method

定义于: yii\db\BaseActiveRecord::getOldAttributes()

返回旧的属性值。

public array getOldAttributes ( )
return array

旧属性值(名称-值对)

                public function getOldAttributes()
{
    return $this->_oldAttributes === null ? [] : $this->_oldAttributes;
}

            
getOldPrimaryKey() public method

定义于: yii\db\BaseActiveRecord::getOldPrimaryKey()

返回旧的主键值。

这指的是在执行查找方法(例如 find()、findOne())后填充到记录中的主键值。即使主键属性手动分配了不同的值,该值也会保持不变。

public mixed getOldPrimaryKey ( $asArray false )
$asArray boolean

是否以数组形式返回主键值。如果为 true,返回值将是一个以列名作为键、列值作为值的数组。如果为 false(默认),则对于非复合主键,将返回一个标量值。

return mixed

旧主键值。如果主键是复合主键或 $asArraytrue,则返回数组(列名 => 列值)。否则返回字符串(如果键值为 null,则返回 null)。

抛出 yii\db\Exception

如果 AR 模型没有主键

                public function getOldPrimaryKey($asArray = false)
{
    $keys = static::primaryKey();
    if (empty($keys)) {
        throw new Exception(get_class($this) . ' does not have a primary key. You should either define a primary key for the corresponding table or override the primaryKey() method.');
    }
    if (!$asArray && count($keys) === 1) {
        return isset($this->_oldAttributes[$keys[0]]) ? $this->_oldAttributes[$keys[0]] : null;
    }
    $values = [];
    foreach ($keys as $name) {
        $values[$name] = isset($this->_oldAttributes[$name]) ? $this->_oldAttributes[$name] : null;
    }
    return $values;
}

            
getPrimaryKey() public method

定义于: yii\db\BaseActiveRecord::getPrimaryKey()

返回主键值。

public mixed getPrimaryKey ( $asArray false )
$asArray boolean

是否以数组形式返回主键值。如果为 true,返回值将是一个以列名作为键、列值作为值的数组。注意,对于复合主键,无论此参数值如何,始终返回数组。

return mixed

主键值。如果主键是复合主键或 $asArraytrue,则返回数组(列名 => 列值)。否则返回字符串(如果键值为 null,则返回 null)。

                public function getPrimaryKey($asArray = false)
{
    $keys = static::primaryKey();
    if (!$asArray && count($keys) === 1) {
        return isset($this->_attributes[$keys[0]]) ? $this->_attributes[$keys[0]] : null;
    }
    $values = [];
    foreach ($keys as $name) {
        $values[$name] = isset($this->_attributes[$name]) ? $this->_attributes[$name] : null;
    }
    return $values;
}

            
getRelatedRecords() public method

定义于: yii\db\BaseActiveRecord::getRelatedRecords()

返回所有填充的关联记录。

另请参阅 getRelation()

public array getRelatedRecords ( )
return array

一个相关记录数组,按关系名称索引。

                public function getRelatedRecords()
{
    return $this->_related;
}

            
getRelation() public method

定义于: yii\db\BaseActiveRecord::getRelation()

返回具有指定名称的关系对象。

关系由 getter 方法定义,该方法返回一个 yii\db\ActiveQueryInterface 对象。它可以在 Active Record 类本身或其行为之一中声明。

public yii\db\ActiveQueryInterface|yii\db\ActiveQuery|null getRelation ( $name, $throwException true )
$name string

关系名称,例如,通过 getOrders() 方法(区分大小写)定义的关系的 orders

$throwException boolean

如果关系不存在,是否抛出异常。

return yii\db\ActiveQueryInterface|yii\db\ActiveQuery|null

关系查询对象。如果关系不存在并且 $throwExceptionfalse,则返回 null

抛出 yii\base\InvalidArgumentException

如果指定的命名关系不存在。

                public function getRelation($name, $throwException = true)
{
    $getter = 'get' . $name;
    try {
        // the relation could be defined in a behavior
        $relation = $this->$getter();
    } catch (UnknownMethodException $e) {
        if ($throwException) {
            throw new InvalidArgumentException(get_class($this) . ' has no relation named "' . $name . '".', 0, $e);
        }
        return null;
    }
    if (!$relation instanceof ActiveQueryInterface) {
        if ($throwException) {
            throw new InvalidArgumentException(get_class($this) . ' has no relation named "' . $name . '".');
        }
        return null;
    }
    if (method_exists($this, $getter)) {
        // relation name is case sensitive, trying to validate it when the relation is defined within this class
        $method = new \ReflectionMethod($this, $getter);
        $realName = lcfirst(substr($method->getName(), 3));
        if ($realName !== $name) {
            if ($throwException) {
                throw new InvalidArgumentException('Relation names are case sensitive. ' . get_class($this) . " has a relation named \"$realName\" instead of \"$name\".");
            }
            return null;
        }
    }
    return $relation;
}

            
getScenario() public method

定义于: yii\base\Model::getScenario()

返回此模型所使用的场景。

场景会影响验证的执行方式以及哪些属性可以被批量赋值。

public string getScenario ( )
return string

此模型所在的场景。默认为 SCENARIO_DEFAULT

                public function getScenario()
{
    return $this->_scenario;
}

            
getTableSchema() public static method

返回与此 AR 类关联的 DB 表的模式信息。

public static yii\db\TableSchema getTableSchema ( )
return yii\db\TableSchema

与该 AR 类关联的 DB 表的架构信息。

抛出 yii\base\InvalidConfigException

如果 AR 类的表不存在。

                public static function getTableSchema()
{
    $tableSchema = static::getDb()
        ->getSchema()
        ->getTableSchema(static::tableName());
    if ($tableSchema === null) {
        throw new InvalidConfigException('The table does not exist: ' . static::tableName());
    }
    return $tableSchema;
}

            
getValidators() public method

定义于: yii\base\Model::getValidators()

返回在 rules() 中声明的所有验证器。

此方法与 getActiveValidators() 不同,后者只返回适用于当前 $scenario 的验证器。

由于此方法返回一个 ArrayObject 对象,您可以通过插入或删除验证器来操作它(在模型行为中很有用)。例如,

$model->validators[] = $newValidator;
public ArrayObject|yii\validators\Validator[] getValidators ( )
return ArrayObject|yii\validators\Validator[]

模型中声明的所有验证器。

                public function getValidators()
{
    if ($this->_validators === null) {
        $this->_validators = $this->createValidators();
    }
    return $this->_validators;
}

            
hasAttribute() public method

定义于: yii\db\BaseActiveRecord::hasAttribute()

返回一个值,指示模型是否具有具有指定名称的属性。

public boolean hasAttribute ( $name )
$name string

属性的名称

return boolean

模型是否具有指定名称的属性。

                public function hasAttribute($name)
{
    return isset($this->_attributes[$name]) || in_array($name, $this->attributes(), true);
}

            
hasErrors() public method

定义于: yii\base\Model::hasErrors()

返回一个值,指示是否存在任何验证错误。

public boolean hasErrors ( $attribute null )
$attribute string|null

属性名称。使用 null 检查所有属性。

return boolean

是否存在任何错误。

                public function hasErrors($attribute = null)
{
    return $attribute === null ? !empty($this->_errors) : isset($this->_errors[$attribute]);
}

            
hasEventHandlers() public method

定义于: yii\base\Component::hasEventHandlers()

返回一个值,指示是否将任何处理程序附加到命名的事件。

public boolean hasEventHandlers ( $name )
$name string

事件名称

return boolean

事件是否已附加任何处理程序。

                public function hasEventHandlers($name)
{
    $this->ensureBehaviors();
    if (!empty($this->_events[$name])) {
        return true;
    }
    foreach ($this->_eventWildcards as $wildcard => $handlers) {
        if (!empty($handlers) && StringHelper::matchWildcard($wildcard, $name)) {
            return true;
        }
    }
    return Event::hasHandlers($this, $name);
}

            
hasMany() public method

有关更多信息,请参见 yii\db\BaseActiveRecord::hasMany()

public yii\db\ActiveQuery hasMany ( $class, array $link )
$class
$link
return yii\db\ActiveQuery
hasMethod() public method

定义于: yii\base\Component::hasMethod()

返回一个值,指示是否定义了方法。

如果以下情况,则定义了方法:

  • 类具有指定名称的方法
  • 附加的行为具有给定名称的方法(当 $checkBehaviors 为 true 时)。
public boolean hasMethod ( $name, $checkBehaviors true )
$name string

属性名称

$checkBehaviors boolean

是否将行为的方法视为此组件的方法

return boolean

方法是否已定义

                public function hasMethod($name, $checkBehaviors = true)
{
    if (method_exists($this, $name)) {
        return true;
    } elseif ($checkBehaviors) {
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $behavior) {
            if ($behavior->hasMethod($name)) {
                return true;
            }
        }
    }
    return false;
}

            
hasOne() public method

有关更多信息,请参见 yii\db\BaseActiveRecord::hasOne()

public yii\db\ActiveQuery hasOne ( $class, array $link )
$class
$link
return yii\db\ActiveQuery
hasProperty() public method

定义于: yii\base\Component::hasProperty()

返回一个值,指示此组件是否定义了属性。

如果以下情况,则定义了属性:

  • 类具有与指定名称关联的 getter 或 setter 方法(在这种情况下,属性名称不区分大小写);
  • 类具有与指定名称相同的成员变量(当 $checkVars 为 true 时);
  • 附加的行为具有给定名称的属性(当 $checkBehaviors 为 true 时)。

另请参阅

public boolean hasProperty ( $name, $checkVars true, $checkBehaviors true )
$name string

属性名称

$checkVars boolean

是否将成员变量视为属性

$checkBehaviors boolean

是否将行为的属性视为此组件的属性

return boolean

属性是否已定义

                public function hasProperty($name, $checkVars = true, $checkBehaviors = true)
{
    return $this->canGetProperty($name, $checkVars, $checkBehaviors) || $this->canSetProperty($name, false, $checkBehaviors);
}

            
init() public method

定义于: yii\db\BaseActiveRecord::init()

初始化对象。

此方法在构造函数结束时调用。默认实现将触发 EVENT_INIT 事件。

public void init ( )

                public function init()
{
    parent::init();
    $this->trigger(self::EVENT_INIT);
}

            
insert() public method

使用此记录的属性值将一行插入到关联的数据库表中。

此方法按顺序执行以下步骤

  1. $runValidationtrue 时,调用 beforeValidate()。如果 beforeValidate() 返回 false,则将跳过其余步骤;
  2. $runValidationtrue 时,调用 afterValidate()。如果验证失败,则将跳过其余步骤;
  3. 调用 beforeSave()。如果 beforeSave() 返回 false,则将跳过其余步骤;
  4. 将记录插入数据库。如果失败,将跳过其余步骤;
  5. 调用 afterSave()

在上述步骤 1、2、3 和 5 中,事件 EVENT_BEFORE_VALIDATEEVENT_AFTER_VALIDATEEVENT_BEFORE_INSERTEVENT_AFTER_INSERT 将由相应的方法引发。

只有 已更改的属性值 将插入数据库。

如果表的 主键 是自动递增的,并且在插入期间为 null,则它将在插入后填充实际值。

例如,要插入客户记录

$customer = new Customer;
$customer->name = $name;
$customer->email = $email;
$customer->insert();
public boolean insert ( $runValidation true, $attributes null )
$runValidation boolean

是否在保存记录之前执行验证(调用 validate())。默认为 true。如果验证失败,记录将不会保存到数据库,此方法将返回 false

$attributes array|null

需要保存的属性列表。默认为 null,这意味着将保存从 DB 加载的所有属性。

return boolean

属性是否有效以及记录是否已成功插入。

抛出 Throwable

如果插入失败。

                public function insert($runValidation = true, $attributes = null)
{
    if ($runValidation && !$this->validate($attributes)) {
        Yii::info('Model not inserted due to validation error.', __METHOD__);
        return false;
    }
    if (!$this->isTransactional(self::OP_INSERT)) {
        return $this->insertInternal($attributes);
    }
    $transaction = static::getDb()->beginTransaction();
    try {
        $result = $this->insertInternal($attributes);
        if ($result === false) {
            $transaction->rollBack();
        } else {
            $transaction->commit();
        }
        return $result;
    } catch (\Exception $e) {
        $transaction->rollBack();
        throw $e;
    } catch (\Throwable $e) {
        $transaction->rollBack();
        throw $e;
    }
}

            
insertInternal() protected method

将活动记录插入到 DB 中,不考虑事务。

protected boolean insertInternal ( $attributes null )
$attributes array|null

需要保存的属性列表。默认为 null,这意味着将保存从 DB 加载的所有属性。

return boolean

记录是否已成功插入。

                protected function insertInternal($attributes = null)
{
    if (!$this->beforeSave(true)) {
        return false;
    }
    $values = $this->getDirtyAttributes($attributes);
    if (($primaryKeys = static::getDb()->schema->insert(static::tableName(), $values)) === false) {
        return false;
    }
    foreach ($primaryKeys as $name => $value) {
        $id = static::getTableSchema()->columns[$name]->phpTypecast($value);
        $this->setAttribute($name, $id);
        $values[$name] = $id;
    }
    $changedAttributes = array_fill_keys(array_keys($values), null);
    $this->setOldAttributes($values);
    $this->afterSave(true, $changedAttributes);
    return true;
}

            
instance() 公共静态方法

定义于: yii\base\StaticInstanceTrait::instance()

返回静态类实例,可用于获取元信息。

public static static instance ( $refresh false )
$refresh boolean

即使静态实例已缓存,是否重新创建静态实例。

return yii\db\ActiveRecord

类实例。

                public static function instance($refresh = false)
{
    $className = get_called_class();
    if ($refresh || !isset(self::$_instances[$className])) {
        self::$_instances[$className] = Yii::createObject($className);
    }
    return self::$_instances[$className];
}

            
instantiate() 公共静态方法

定义于: yii\db\BaseActiveRecord::instantiate()

创建一个活动记录实例。

此方法与 populateRecord() 一起被 yii\db\ActiveQuery 调用。 它并非用于直接创建新记录。

如果要创建的实例依赖于要填充到记录中的行数据,可以覆盖此方法。 例如,通过根据列的值创建记录,您可以实现所谓的单表继承映射。

public static static instantiate ( $row )
$row array

要填充到记录中的行数据。

return yii\db\BaseActiveRecord

新创建的活动记录

                public static function instantiate($row)
{
    return new static();
}

            
isAttributeActive() 公共方法

定义于: yii\base\Model::isAttributeActive()

返回一个值,指示属性在当前场景中是否处于活动状态。

另请参阅 activeAttributes()

public boolean isAttributeActive ( $attribute )
$attribute string

属性名称

return boolean

属性在当前场景中是否处于活动状态

                public function isAttributeActive($attribute)
{
    return in_array($attribute, $this->activeAttributes(), true);
}

            
isAttributeChanged() 公共方法

定义于: yii\db\BaseActiveRecord::isAttributeChanged()

返回一个值,指示命名的属性是否已更改。

public boolean isAttributeChanged ( $name, $identical true )
$name string

属性的名称。

$identical boolean

新值和旧值的比较是否使用 === 进行相同值比较,默认为 true。 否则使用 == 进行比较。 此参数从版本 2.0.4 开始可用。

return boolean

属性是否已更改

                public function isAttributeChanged($name, $identical = true)
{
    if (isset($this->_attributes[$name], $this->_oldAttributes[$name])) {
        if ($identical) {
            return $this->_attributes[$name] !== $this->_oldAttributes[$name];
        }
        return $this->_attributes[$name] != $this->_oldAttributes[$name];
    }
    return isset($this->_attributes[$name]) || isset($this->_oldAttributes[$name]);
}

            
isAttributeRequired() 公共方法

定义于: yii\base\Model::isAttributeRequired()

返回一个值,指示属性是否为必需的。

这是通过检查属性是否在当前 $scenario 中与 required 验证规则相关联来确定的。

请注意,当验证器使用 $when 应用条件验证时,此方法将返回 false,而不管 when 条件如何,因为它可能在模型加载数据之前被调用。

public boolean isAttributeRequired ( $attribute )
$attribute string

属性名称

return boolean

属性是否必需

                public function isAttributeRequired($attribute)
{
    foreach ($this->getActiveValidators($attribute) as $validator) {
        if ($validator instanceof RequiredValidator && $validator->when === null) {
            return true;
        }
    }
    return false;
}

            
isAttributeSafe() 公共方法

定义于: yii\base\Model::isAttributeSafe()

返回一个值,指示属性是否对大量分配安全。

另请参阅 safeAttributes()

public boolean isAttributeSafe ( $attribute )
$attribute string

属性名称

return boolean

属性是否可以进行批量赋值

                public function isAttributeSafe($attribute)
{
    return in_array($attribute, $this->safeAttributes(), true);
}

            
isPrimaryKey() 公共静态方法

定义于: yii\db\BaseActiveRecord::isPrimaryKey()

返回一个值,指示给定的属性集是否代表此模型的主键。

public static boolean isPrimaryKey ( $keys )
$keys array

要检查的属性集

return boolean

给定的属性集是否代表此模型的主键

                public static function isPrimaryKey($keys)
{
    $pks = static::primaryKey();
    if (count($keys) === count($pks)) {
        return count(array_intersect($keys, $pks)) === count($pks);
    }
    return false;
}

            
isRelationPopulated() 公共方法

定义于: yii\db\BaseActiveRecord::isRelationPopulated()

检查命名的关系是否已填充记录。

另请参阅 getRelation()

public boolean isRelationPopulated ( $name )
$name string

关系名称,例如,通过 getOrders() 方法(区分大小写)定义的关系的 orders

return boolean

关系是否已填充记录。

                public function isRelationPopulated($name)
{
    return array_key_exists($name, $this->_related);
}

            
isTransactional() 公共方法

返回一个值,指示指定的操作在当前 $scenario 中是否为事务性的。

public boolean isTransactional ( $operation )
$operation integer

要检查的操作。 可能的值是 OP_INSERTOP_UPDATEOP_DELETE

return boolean

指定的操作在当前 $scenario 中是否具有事务性。

                public function isTransactional($operation)
{
    $scenario = $this->getScenario();
    $transactions = $this->transactions();
    return isset($transactions[$scenario]) && ($transactions[$scenario] & $operation);
}

            
link() 公共方法

定义于: yii\db\BaseActiveRecord::link()

建立两个模型之间的关系。

通过将一个模型中的外键值设置为另一个模型中相应的 primary key 值来建立关系。 具有外键的模型将被保存到数据库中,不会进行验证,并且不会触发事件/行为。

如果关系涉及连接表,则将向连接表中插入一行,其中包含来自两个模型的主键值。

请注意,此方法要求主键值不为空。

public void link ( $name, $model, $extraColumns = [] )
$name string

关系的区分大小写名称,例如,对于通过 getOrders() 方法定义的关系,为 orders

$model yii\db\ActiveRecordInterface

要与当前模型关联的模型。

$extraColumns array

要保存到连接表中的其他列值。 此参数仅对涉及连接表的关系有意义(即,使用 yii\db\ActiveRelationTrait::via()yii\db\ActiveQuery::viaTable() 设置的关系)。

抛出 yii\base\InvalidCallException

如果方法无法关联两个模型。

load() 公共方法

定义于: yii\base\Model::load()

使用输入数据填充模型。

此方法提供了一个方便的快捷方式:

if (isset($_POST['FormName'])) {
    $model->attributes = $_POST['FormName'];
    if ($model->save()) {
        // handle success
    }
}

使用 load(),可以将其写成

if ($model->load($_POST) && $model->save()) {
    // handle success
}

load() 从模型的 formName() 方法(可以覆盖)中获取 'FormName',除非给出了 $formName 参数。 如果表单名称为空,load() 将使用整个 $data 填充模型,而不是 $data['FormName']

请注意,填充的数据会经过 setAttributes() 的安全检查。

public boolean load ( $data, $formName null )
$data array

要加载的数据数组,通常为 $_POST$_GET

$formName string|null

用于将数据加载到模型中的表单名称,表单未使用时为空字符串。如果未设置,则使用 formName()

return boolean

load() 是否在 $data 中找到了预期的表单。

                public function load($data, $formName = null)
{
    $scope = $formName === null ? $this->formName() : $formName;
    if ($scope === '' && !empty($data)) {
        $this->setAttributes($data);
        return true;
    } elseif (isset($data[$scope])) {
        $this->setAttributes($data[$scope]);
        return true;
    }
    return false;
}

            
loadDefaultValues() 公共方法

从数据库表模式加载默认值。

您可以在创建新实例后调用此方法来加载默认值。

// class Customer extends \yii\db\ActiveRecord
$customer = new Customer();
$customer->loadDefaultValues();
public $this loadDefaultValues ( $skipIfSet true )
$skipIfSet boolean

是否保留现有值。这只会为值为 null 的属性设置默认值。

return $this

模型实例本身。

                public function loadDefaultValues($skipIfSet = true)
{
    $columns = static::getTableSchema()->columns;
    foreach ($this->attributes() as $name) {
        if (isset($columns[$name])) {
            $defaultValue = $columns[$name]->defaultValue;
            if ($defaultValue !== null && (!$skipIfSet || $this->getAttribute($name) === null)) {
                $this->setAttribute($name, $defaultValue);
            }
        }
    }
    return $this;
}

            
loadMultiple() 公共静态方法

定义于: yii\base\Model::loadMultiple()

使用来自最终用户的數據填充一组模型。

此方法主要用于收集表格数据输入。要加载到每个模型中的数据为 $data[formName][index],其中 formName 指的是 formName() 的值,index$models 数组中模型的索引。如果 formName() 为空,则使用 $data[index] 来填充每个模型。填充到每个模型中的数据会经过 setAttributes() 的安全检查。

public static boolean loadMultiple ( $models, $data, $formName null )
$models array

要填充的模型。请注意,所有模型都应该具有相同的类。

$data array

$data

$formName string|null

数据数组。这通常为 $_POST$_GET,但也可能是最终用户提供的任何有效数组。

return boolean

$formName

                public static function loadMultiple($models, $data, $formName = null)
{
    if ($formName === null) {
        /* @var $first Model|false */
        $first = reset($models);
        if ($first === false) {
            return false;
        }
        $formName = $first->formName();
    }
    $success = false;
    foreach ($models as $i => $model) {
        /* @var $model Model */
        if ($formName == '') {
            if (!empty($data[$i]) && $model->load($data[$i], '')) {
                $success = true;
            }
        } elseif (!empty($data[$formName][$i]) && $model->load($data[$formName][$i], '')) {
            $success = true;
        }
    }
    return $success;
}

            
用于将数据加载到模型中的表单名称。如果未设置,它将使用 $models 中第一个模型的 formName() 值。此参数自版本 2.0.1 起可用。

是否至少一个模型成功填充。

为已加载的主模型急切加载相关模型。

loadRelations() 公共方法 (自版本 2.0.50 起可用)

$customer = Customer::find()->where(['id' => 123])->one();
if (Yii:app()->getUser()->getIdentity()->canAccessOrders()) {
    $customer->loadRelations('orders.items');
}
定义于: yii\db\BaseActiveRecord::loadRelations()
有助于减少针对数据库执行的查询次数,如果某些关联模型仅在满足特定条件时才使用。例如 public void loadRelations ( $relationNames, $asArray false )

$relationNames

$asArray boolean

string|array

                public function loadRelations($relationNames, $asArray = false)
{
    $models = [$this];
    static::loadRelationsFor($models, $relationNames, $asArray);
}

            
要从数据库加载的此模型的关系名称。有关如何指定此参数,请参见 yii\db\ActiveQueryInterface::with()

$asArray

为已加载的主模型急切加载相关模型。

loadRelations() 公共方法 (自版本 2.0.50 起可用)

$customers = Customer::find()->where(['country_id' => 123])->all();
if (Yii:app()->getUser()->getIdentity()->canAccessOrders()) {
    Customer::loadRelationsFor($customers, 'orders.items');
}
是否将每个关系加载为数组或对象(如果关系本身未指定)。
$models loadRelationsFor() 公共静态方法 (自版本 2.0.50 起可用)

定义于: yii\db\BaseActiveRecord::loadRelationsFor()

  • public static void loadRelationsFor ( &$models, $relationNames, $asArray false )
  • $models
有助于减少针对数据库执行的查询次数,如果某些关联模型仅在满足特定条件时才使用。例如 public void loadRelations ( $relationNames, $asArray false )

array|yii\db\ActiveRecordInterface[]

$asArray boolean

主模型数组。每个模型都应该具有相同的类型,并且可以是

                public static function loadRelationsFor(&$models, $relationNames, $asArray = false)
{
    // ActiveQueryTrait::findWith() called below assumes $models array is non-empty.
    if (empty($models)) {
        return;
    }
    static::find()->asArray($asArray)->findWith((array)$relationNames, $models);
}

            
活动记录实例;

由数组表示的活动记录实例(即活动记录是使用 yii\db\ActiveQuery::asArray() 加载的)。

标记属性为脏属性。

$relationNames

要从数据库加载的主模型的关系名称。有关如何指定此参数,请参见 yii\db\ActiveQueryInterface::with()
$name string

属性名称

                public function markAttributeDirty($name)
{
    unset($this->_oldAttributes[$name]);
}

            
$asArray

是否将每个关联模型加载为数组或对象(如果关系本身未指定)。

从此组件分离现有的事件处理程序。

markAttributeDirty() 公共方法

定义于: yii\db\BaseActiveRecord::markAttributeDirty()

可以在调用 update() 时调用此方法来强制更新记录,即使没有对记录进行任何更改。

public void markAttributeDirty ( $name )
$name string

off() 公共方法

定义于: yii\base\Component::off() 此方法与 on() 相反。

注意:如果为事件名称传递通配符模式,则只会删除使用此通配符注册的处理程序,而使用与该通配符匹配的普通名称注册的处理程序将保留。

return boolean

另请参阅 on()

                public function off($name, $handler = null)
{
    $this->ensureBehaviors();
    if (empty($this->_events[$name]) && empty($this->_eventWildcards[$name])) {
        return false;
    }
    if ($handler === null) {
        unset($this->_events[$name], $this->_eventWildcards[$name]);
        return true;
    }
    $removed = false;
    // plain event names
    if (isset($this->_events[$name])) {
        foreach ($this->_events[$name] as $i => $event) {
            if ($event[0] === $handler) {
                unset($this->_events[$name][$i]);
                $removed = true;
            }
        }
        if ($removed) {
            $this->_events[$name] = array_values($this->_events[$name]);
            return true;
        }
    }
    // wildcard event names
    if (isset($this->_eventWildcards[$name])) {
        foreach ($this->_eventWildcards[$name] as $i => $event) {
            if ($event[0] === $handler) {
                unset($this->_eventWildcards[$name][$i]);
                $removed = true;
            }
        }
        if ($removed) {
            $this->_eventWildcards[$name] = array_values($this->_eventWildcards[$name]);
            // remove empty wildcards to save future redundant regex checks:
            if (empty($this->_eventWildcards[$name])) {
                unset($this->_eventWildcards[$name]);
            }
        }
    }
    return $removed;
}

            
public boolean off ( $name, $handler null )

$name

返回在指定偏移量处是否存在元素。

事件名称

$handler
callable|null mixed

要删除的事件处理程序。如果为 null,将删除附加到命名事件的所有处理程序。

return boolean

如果找到并分离处理程序

                #[\ReturnTypeWillChange]
public function offsetExists($offset)
{
    return $this->__isset($offset);
}

            
offsetExists() 公共方法

定义于: yii\db\BaseActiveRecord::offsetExists()

返回指定偏移量处的元素。

此方法是 ArrayAccess 接口所必需的。

public boolean offsetExists ( $offset )
callable|null string

$offset

return mixed

要检查的偏移量

                #[\ReturnTypeWillChange]
public function offsetGet($offset)
{
    return $this->$offset;
}

            
指定偏移量处是否有一个元素。

offsetGet() 公共方法

在指定偏移量处设置元素。

此方法由 SPL 接口 ArrayAccess 要求。当您使用类似 $model[$offset] = $value; 的代码时,会隐式调用它。

public void offsetSet ( $offset, $value )
callable|null string

要设置元素的偏移量

$value mixed

元素值

                #[\ReturnTypeWillChange]
public function offsetSet($offset, $value)
{
    $this->$offset = $value;
}

            
offsetUnset() 公共方法

定义于: yii\db\BaseActiveRecord::offsetUnset()

将指定偏移量处的元素值设置为 null。

此方法由 SPL 接口 ArrayAccess 要求。当您使用类似 unset($model[$offset]) 的代码时,会隐式调用它。

public void offsetUnset ( $offset )
callable|null mixed

要取消设置元素的偏移量

                public function offsetUnset($offset)
{
    if (property_exists($this, $offset)) {
        $this->$offset = null;
    } else {
        unset($this->$offset);
    }
}

            
on() 公共方法

定义于: yii\base\Component::on()

将事件处理程序附加到事件。

事件处理程序必须是有效的 PHP 回调函数。以下是一些示例

function ($event) { ... }         // anonymous function
[$object, 'handleClick']          // $object->handleClick()
['Page', 'handleClick']           // Page::handleClick()
'handleClick'                     // global function handleClick()

事件处理程序必须使用以下签名定义,

function ($event)

其中 $event 是一个 yii\base\Event 对象,其中包含与事件关联的参数。

从 2.0.14 版本开始,您可以将事件名称指定为通配符模式

$component->on('event.group.*', function ($event) {
    Yii::trace($event->name . ' is triggered.');
});

另请参阅 off()

public void on ( $name, $handler, $data null, $append true )
$name string

事件名称

定义于: yii\base\Component::off() callable

事件处理程序

$data mixed

触发事件时要传递给事件处理程序的数据。当调用事件处理程序时,可以通过 yii\base\Event::$data 访问此数据。

$append boolean

是否将新的事件处理程序追加到现有处理程序列表的末尾。如果为 false,则新的处理程序将插入现有处理程序列表的开头。

                public function on($name, $handler, $data = null, $append = true)
{
    $this->ensureBehaviors();
    if (strpos($name, '*') !== false) {
        if ($append || empty($this->_eventWildcards[$name])) {
            $this->_eventWildcards[$name][] = [$handler, $data];
        } else {
            array_unshift($this->_eventWildcards[$name], [$handler, $data]);
        }
        return;
    }
    if ($append || empty($this->_events[$name])) {
        $this->_events[$name][] = [$handler, $data];
    } else {
        array_unshift($this->_events[$name], [$handler, $data]);
    }
}

            
onUnsafeAttribute() 公共方法

定义于: yii\base\Model::onUnsafeAttribute()

当大量分配不安全的属性时,将调用此方法。

默认实现将在 YII_DEBUG 处于开启状态时记录警告消息。否则,它不会执行任何操作。

public void onUnsafeAttribute ( $name, $value )
$name string

不安全的属性名称

$value mixed

属性值

                public function onUnsafeAttribute($name, $value)
{
    if (YII_DEBUG) {
        Yii::debug("Failed to set unsafe attribute '$name' in '" . get_class($this) . "'.", __METHOD__);
    }
}

            
optimisticLock() 公共方法

定义于: yii\db\BaseActiveRecord::optimisticLock()

返回用于实现乐观锁定的列的名称,该列存储锁定版本。

乐观锁允许多个用户访问同一记录进行编辑,并避免潜在的冲突。如果用户尝试在某些陈旧数据(因为另一个用户已修改数据)上保存记录时,将抛出 yii\db\StaleObjectException 异常,并且更新或删除将被跳过。

乐观锁仅受 update()delete() 支持。

要使用乐观锁

  1. 创建一个列来存储每行的版本号。列类型应为 BIGINT DEFAULT 0。重写此方法以返回此列的名称。
  2. 确保在任何更新或删除之前将版本值提交并加载到您的模型中。或者将 OptimisticLockBehavior 添加到您的模型类中以自动执行此过程。
  3. 在收集用户输入的 Web 表单中,添加一个隐藏字段来存储要更新的记录的锁版本。
  4. 在执行数据更新的控制器操作中,尝试捕获 yii\db\StaleObjectException 并实现必要的业务逻辑(例如合并更改,提示陈旧数据)来解决冲突。
public string|null optimisticLock ( )
return string|null

存储表行锁版本的列名。如果返回 null(默认实现),则不支持乐观锁。

                public function optimisticLock()
{
    return null;
}

            
populateRecord() 公共静态方法

使用来自数据库/存储的一行数据填充活动记录对象。

这是一个内部方法,用于在从数据库中获取数据后创建活动记录对象。它主要由 yii\db\ActiveQuery 用于将查询结果填充到活动记录中。

当手动调用此方法时,您应该在创建的记录上调用 afterFind() 以触发 afterFind 事件

public static void populateRecord ( $record, $row )
$record yii\db\BaseActiveRecord

要填充的记录。在大多数情况下,这将是先前由 instantiate() 创建的实例。

$row array

属性值(名称 => 值)

                public static function populateRecord($record, $row)
{
    $columns = static::getTableSchema()->columns;
    foreach ($row as $name => $value) {
        if (isset($columns[$name])) {
            $row[$name] = $columns[$name]->phpTypecast($value);
        }
    }
    parent::populateRecord($record, $row);
}

            
populateRelation() 公共方法

定义于: yii\db\BaseActiveRecord::populateRelation()

使用相关记录填充命名的关系。

请注意,此方法不会检查关系是否存在。

另请参阅 getRelation()

public void populateRelation ( $name, $records )
$name string

关系名称,例如,通过 getOrders() 方法(区分大小写)定义的关系的 orders

$records yii\db\ActiveRecordInterface|array|null

要填充到关系中的相关记录。

                public function populateRelation($name, $records)
{
    foreach ($this->_relationsDependencies as &$relationNames) {
        unset($relationNames[$name]);
    }
    $this->_related[$name] = $records;
}

            
primaryKey() 公共静态方法

返回此 AR 类的主键名称。

默认实现将返回与此 AR 类关联的 DB 表中声明的主键。

如果 DB 表未声明任何主键,则应重写此方法以返回要作为此 AR 类主键使用的属性。

请注意,即使对于具有单个主键的表,也应返回数组。

public static string[] primaryKey ( )
return string[]

关联数据库表的主键。

                public static function primaryKey()
{
    return static::getTableSchema()->primaryKey;
}

            
refresh() 公共方法

使用最新数据重新填充此活动记录。

如果刷新成功,则将触发 EVENT_AFTER_REFRESH 事件。此事件自 2.0.8 版本起可用。

public boolean refresh ( )
return boolean

该行是否仍然存在于数据库中。如果为 true,则最新的数据将被填充到此活动记录中。否则,此记录将保持不变。

                public function refresh()
{
    $query = static::find();
    $tableName = key($query->getTablesUsedInFrom());
    $pk = [];
    // disambiguate column names in case ActiveQuery adds a JOIN
    foreach ($this->getPrimaryKey(true) as $key => $value) {
        $pk[$tableName . '.' . $key] = $value;
    }
    $query->where($pk);
    /* @var $record BaseActiveRecord */
    $record = $query->noCache()->one();
    return $this->refreshInternal($record);
}

            
refreshInternal() 受保护的方法(自 2.0.13 版本起可用)

定义于: yii\db\BaseActiveRecord::refreshInternal()

使用新获取的实例重新填充此活动记录。

另请参阅 refresh()

protected boolean refreshInternal ( $record )
$record yii\db\BaseActiveRecord

要从中获取属性的记录。

return boolean

刷新是否成功。

                protected function refreshInternal($record)
{
    if ($record === null) {
        return false;
    }
    foreach ($this->attributes() as $name) {
        $this->_attributes[$name] = isset($record->_attributes[$name]) ? $record->_attributes[$name] : null;
    }
    $this->_oldAttributes = $record->_oldAttributes;
    $this->_related = [];
    $this->_relationsDependencies = [];
    $this->afterRefresh();
    return true;
}

            
resolveFields() protected method

定义于: yii\base\ArrayableTrait::resolveFields()

确定 toArray() 可以返回哪些字段。

此方法将首先从给定的字段中提取根字段。然后,它将检查请求的根字段与在 fields()extraFields() 中声明的字段,以确定哪些字段可以返回。

protected array resolveFields ( array $fields, array $expand )
$fields array

正在请求导出字段

$expand array

正在请求导出额外的字段

return array

要导出的字段列表。数组键是字段名,数组值是相应的对象属性名或 PHP 可调用函数,它们返回字段值。

                protected function resolveFields(array $fields, array $expand)
{
    $fields = $this->extractRootFields($fields);
    $expand = $this->extractRootFields($expand);
    $result = [];
    foreach ($this->fields() as $field => $definition) {
        if (is_int($field)) {
            $field = $definition;
        }
        if (empty($fields) || in_array($field, $fields, true)) {
            $result[$field] = $definition;
        }
    }
    if (empty($expand)) {
        return $result;
    }
    foreach ($this->extraFields() as $field => $definition) {
        if (is_int($field)) {
            $field = $definition;
        }
        if (in_array($field, $expand, true)) {
            $result[$field] = $definition;
        }
    }
    return $result;
}

            
rules() public method

定义于: yii\base\Model::rules()

返回属性的验证规则。

验证规则由 validate() 用于检查属性值是否有效。子类可以重写此方法来声明不同的验证规则。

每个规则都是一个数组,具有以下结构

[
    ['attribute1', 'attribute2'],
    'validator type',
    'on' => ['scenario1', 'scenario2'],
    //...other parameters...
]

其中

  • 属性列表:必需,指定要验证的属性数组,对于单个属性,可以传递一个字符串;
  • 验证器类型:必需,指定要使用的验证器。它可以是内置验证器名称、模型类的​​方法名、匿名函数或验证器类名。
  • on:可选,指定 scenarios 数组,其中可以应用验证规则。如果未设置此选项,则规则将应用于所有场景。
  • 可以指定其他名称-值对来初始化相应的验证器属性。有关可能的属性,请参阅各个验证器类 API。

验证器可以是继承自 yii\validators\Validator 的类的对象,也可以是模型类方法(称为内联验证器),该方法具有以下签名

// $params refers to validation parameters given in the rule
function validatorName($attribute, $params)

在上面的 $attribute 中,指代当前正在验证的属性,而 $params 包含验证器配置选项的数组,例如 string 验证器的情况下的 max。当前正在验证的属性的值可以通过 $this->{$attribute} 访问。注意 $ 之前的 attribute;这将获取变量 $attribute 的值并将其用作属性的名称来访问。

Yii 还提供了一组 内置验证器。每个都具有别名,可以在指定验证规则时使用。

以下是一些示例

[
    // built-in "required" validator
    [['username', 'password'], 'required'],
    // built-in "string" validator customized with "min" and "max" properties
    ['username', 'string', 'min' => 3, 'max' => 12],
    // built-in "compare" validator that is used in "register" scenario only
    ['password', 'compare', 'compareAttribute' => 'password2', 'on' => 'register'],
    // an inline validator defined via the "authenticate()" method in the model class
    ['password', 'authenticate', 'on' => 'login'],
    // a validator of class "DateRangeValidator"
    ['dateRange', 'DateRangeValidator'],
];

注意,为了继承父类中定义的规则,子类需要使用诸如 array_merge() 之类的函数将父规则与子规则合并。

另请参阅 scenarios()

public array rules ( )
return array

验证规则

                public function rules()
{
    return [];
}

            
safeAttributes() public method

定义于: yii\base\Model::safeAttributes()

返回在当前场景中可以大量分配的安全属性名称。

public string[] safeAttributes ( )
return string[]

安全属性名称

                public function safeAttributes()
{
    $scenario = $this->getScenario();
    $scenarios = $this->scenarios();
    if (!isset($scenarios[$scenario])) {
        return [];
    }
    $attributes = [];
    foreach ($scenarios[$scenario] as $attribute) {
        if (
            $attribute !== ''
            && strncmp($attribute, '!', 1) !== 0
            && !in_array('!' . $attribute, $scenarios[$scenario])
        ) {
            $attributes[] = $attribute;
        }
    }
    return $attributes;
}

            
save() public method

定义于: yii\db\BaseActiveRecord::save()

保存当前记录。

此方法将调用 insert(),当 $isNewRecordtrue 时,或调用 update(),当 $isNewRecordfalse 时。

例如,要保存客户记录

$customer = new Customer; // or $customer = Customer::findOne($id);
$customer->name = $name;
$customer->email = $email;
$customer->save();
public boolean save ( $runValidation true, $attributeNames null )
$runValidation boolean

是否在保存记录之前执行验证(调用 validate())。默认为 true。如果验证失败,记录将不会保存到数据库,此方法将返回 false

$attributeNames array|null

需要保存的属性名列表。默认为 null,这意味着将保存从 DB 加载的所有属性。

return boolean

保存是否成功(即没有发生验证错误)。

                public function save($runValidation = true, $attributeNames = null)
{
    if ($this->getIsNewRecord()) {
        return $this->insert($runValidation, $attributeNames);
    }
    return $this->update($runValidation, $attributeNames) !== false;
}

            
scenarios() public method

定义于: yii\base\Model::scenarios()

返回场景列表和相应的活动属性。

活动属性是在当前场景中受验证的属性。返回的数组应采用以下格式

[
    'scenario1' => ['attribute11', 'attribute12', ...],
    'scenario2' => ['attribute21', 'attribute22', ...],
    ...
]

默认情况下,活动属性被认为是安全的,可以被批量赋值。如果属性不应该被批量赋值(因此被认为是不安全的),请在属性前面添加一个感叹号(例如 '!rank')。

此方法的默认实现将返回在 rules() 声明中找到的所有场景。名为 SCENARIO_DEFAULT 的特殊场景将包含在 rules() 中找到的所有属性。每个场景将与被应用于该场景的验证规则验证的属性相关联。

public array scenarios ( )
return array

场景列表及其相应的活动属性。

                public function scenarios()
{
    $scenarios = [self::SCENARIO_DEFAULT => []];
    foreach ($this->getValidators() as $validator) {
        foreach ($validator->on as $scenario) {
            $scenarios[$scenario] = [];
        }
        foreach ($validator->except as $scenario) {
            $scenarios[$scenario] = [];
        }
    }
    $names = array_keys($scenarios);
    foreach ($this->getValidators() as $validator) {
        if (empty($validator->on) && empty($validator->except)) {
            foreach ($names as $name) {
                foreach ($validator->attributes as $attribute) {
                    $scenarios[$name][$attribute] = true;
                }
            }
        } elseif (empty($validator->on)) {
            foreach ($names as $name) {
                if (!in_array($name, $validator->except, true)) {
                    foreach ($validator->attributes as $attribute) {
                        $scenarios[$name][$attribute] = true;
                    }
                }
            }
        } else {
            foreach ($validator->on as $name) {
                foreach ($validator->attributes as $attribute) {
                    $scenarios[$name][$attribute] = true;
                }
            }
        }
    }
    foreach ($scenarios as $scenario => $attributes) {
        if (!empty($attributes)) {
            $scenarios[$scenario] = array_keys($attributes);
        }
    }
    return $scenarios;
}

            
setAttribute() public method

定义于: yii\db\BaseActiveRecord::setAttribute()

设置命名的属性值。

另请参见 hasAttribute()

public void setAttribute ( $name, $value )
$name string

属性名称

$value mixed

属性值。

抛出 yii\base\InvalidArgumentException

如果名为属性不存在。

                public function setAttribute($name, $value)
{
    if ($this->hasAttribute($name)) {
        if (
            !empty($this->_relationsDependencies[$name])
            && (!array_key_exists($name, $this->_attributes) || $this->_attributes[$name] !== $value)
        ) {
            $this->resetDependentRelations($name);
        }
        $this->_attributes[$name] = $value;
    } else {
        throw new InvalidArgumentException(get_class($this) . ' has no attribute named "' . $name . '".');
    }
}

            
setAttributes() public method

定义于: yii\base\Model::setAttributes()

以大量方式设置属性值。

另请参阅

public void setAttributes ( $values, $safeOnly true )
$values array

要分配给模型的属性值(名称 => 值)。

$safeOnly boolean

分配是否只应该完成到安全属性。安全属性是与当前 $scenario 中的验证规则关联的属性。

                public function setAttributes($values, $safeOnly = true)
{
    if (is_array($values)) {
        $attributes = array_flip($safeOnly ? $this->safeAttributes() : $this->attributes());
        foreach ($values as $name => $value) {
            if (isset($attributes[$name])) {
                $this->$name = $value;
            } elseif ($safeOnly) {
                $this->onUnsafeAttribute($name, $value);
            }
        }
    }
}

            
setIsNewRecord() public method

定义于: yii\db\BaseActiveRecord::setIsNewRecord()

设置指示记录是否为新的的值。

另请参阅 getIsNewRecord()

public void setIsNewRecord ( $value )
$value boolean

记录是否为新记录,在调用 save() 时应该插入。

                public function setIsNewRecord($value)
{
    $this->_oldAttributes = $value ? null : $this->_attributes;
}

            
setOldAttribute() public method

定义于: yii\db\BaseActiveRecord::setOldAttribute()

设置命名的属性的旧值。

另请参见 hasAttribute()

public void setOldAttribute ( $name, $value )
$name string

属性名称

$value mixed

旧属性值。

抛出 yii\base\InvalidArgumentException

如果名为属性不存在。

                public function setOldAttribute($name, $value)
{
    if ($this->canSetOldAttribute($name)) {
        $this->_oldAttributes[$name] = $value;
    } else {
        throw new InvalidArgumentException(get_class($this) . ' has no attribute named "' . $name . '".');
    }
}

            
setOldAttributes() 公共方法

定义于: yii\db\BaseActiveRecord::setOldAttributes()

设置旧的属性值。

所有现有的旧属性值将被丢弃。

public void setOldAttributes ( $values )
$values array|null

要设置的旧属性值。如果设置为 null,则此记录被视为 新的

                public function setOldAttributes($values)
{
    $this->_oldAttributes = $values;
}

            
setScenario() 公共方法

定义于: yii\base\Model::setScenario()

设置模型的场景。

注意,此方法不会检查场景是否存在。方法 validate() 将执行此检查。

public void setScenario ( $value )
$value string

此模型所处的场景。

                public function setScenario($value)
{
    $this->_scenario = $value;
}

            
tableName() 公共静态方法

声明与此 AR 类关联的数据库表名称。

默认情况下,此方法通过调用 yii\helpers\Inflector::camel2id() 并使用前缀 yii\db\Connection::$tablePrefix 返回类名作为表名。例如,如果 yii\db\Connection::$tablePrefixtbl_,则 Customer 成为 tbl_customer,而 OrderItem 则成为 tbl_order_item。如果表名不符合此约定,则可以重写此方法。

public static string tableName ( )
return string

表名

                public static function tableName()
{
    return '{{%' . Inflector::camel2id(StringHelper::basename(get_called_class()), '_') . '}}';
}

            
toArray() 公共方法

定义于: yii\base\ArrayableTrait::toArray()

将模型转换为数组。

此方法将首先通过调用 resolveFields() 确定要包含在结果数组中的字段。然后,它将使用这些字段将模型转换为数组。如果 $recursive 为 true,则所有嵌入对象也将被转换为数组。当嵌入对象为 yii\base\Arrayable 时,它们的相应嵌套字段将被提取并传递给 toArray()

如果模型实现了 yii\web\Linkable 接口,则结果数组还将包含一个 _link 元素,该元素引用接口指定的一系列链接。

public array toArray ( array $fields = [], array $expand = [], $recursive true )
$fields array

请求的字段。如果为空或包含 '*',则将返回由 fields() 指定的所有字段。字段可以嵌套,用点 (.) 分隔。例如:item.field.sub-field $recursive 必须为 true 才能提取嵌套字段。如果 $recursive 为 false,则只提取根字段。

$expand array

请求用于导出的附加字段。只有在 extraFields() 中声明的字段才会被考虑。Expand 也可以嵌套,用点 (.) 分隔。例如:item.expand1.expand2 $recursive 必须为 true 才能提取嵌套的 expands。如果 $recursive 为 false,则只提取根 expands。

$recursive boolean

是否递归返回嵌入对象的数组表示形式。

return array

对象的数组表示形式

                public function toArray(array $fields = [], array $expand = [], $recursive = true)
{
    $data = [];
    foreach ($this->resolveFields($fields, $expand) as $field => $definition) {
        $attribute = is_string($definition) ? $this->$definition : $definition($this, $field);
        if ($recursive) {
            $nestedFields = $this->extractFieldsFor($fields, $field);
            $nestedExpand = $this->extractFieldsFor($expand, $field);
            if ($attribute instanceof Arrayable) {
                $attribute = $attribute->toArray($nestedFields, $nestedExpand);
            } elseif ($attribute instanceof \JsonSerializable) {
                $attribute = $attribute->jsonSerialize();
            } elseif (is_array($attribute)) {
                $attribute = array_map(
                    function ($item) use ($nestedFields, $nestedExpand) {
                        if ($item instanceof Arrayable) {
                            return $item->toArray($nestedFields, $nestedExpand);
                        } elseif ($item instanceof \JsonSerializable) {
                            return $item->jsonSerialize();
                        }
                        return $item;
                    },
                    $attribute
                );
            }
        }
        $data[$field] = $attribute;
    }
    if ($this instanceof Linkable) {
        $data['_links'] = Link::serialize($this->getLinks());
    }
    return $recursive ? ArrayHelper::toArray($data) : $data;
}

            
transactions() 公共方法

声明应在不同场景中的事务中执行哪些 DB 操作。

支持的数据库操作包括:OP_INSERTOP_UPDATEOP_DELETE,它们分别对应于 insert()update()delete() 方法。默认情况下,这些方法不会包含在数据库事务中。

在某些情况下,为了确保数据一致性,您可能希望将其中一些或所有这些方法包含在事务中。您可以通过重写此方法并返回需要进行事务处理的操作来实现这一点。例如,

return [
    'admin' => self::OP_INSERT,
    'api' => self::OP_INSERT | self::OP_UPDATE | self::OP_DELETE,
    // the above is equivalent to the following:
    // 'api' => self::OP_ALL,

];

上面的声明指定在 "admin" 场景中,插入操作 (insert()) 应该在事务中执行;而在 "api" 场景中,所有操作都应该在事务中执行。

public array transactions ( )
return array

事务操作的声明。数组键是场景名称,数组值是相应的交易操作。

                public function transactions()
{
    return [];
}

            
trigger() 公共方法

定义于: yii\base\Component::trigger()

触发事件。

此方法表示事件的发生。它调用事件的所有已附加处理程序,包括类级处理程序。

public void trigger ( $name, yii\base\Event $event null )
$name string

事件名称

$event yii\base\Event|null

事件实例。如果未设置,将创建一个默认的 yii\base\Event 对象。

                public function trigger($name, Event $event = null)
{
    $this->ensureBehaviors();
    $eventHandlers = [];
    foreach ($this->_eventWildcards as $wildcard => $handlers) {
        if (StringHelper::matchWildcard($wildcard, $name)) {
            $eventHandlers[] = $handlers;
        }
    }
    if (!empty($this->_events[$name])) {
        $eventHandlers[] = $this->_events[$name];
    }
    if (!empty($eventHandlers)) {
        $eventHandlers = call_user_func_array('array_merge', $eventHandlers);
        if ($event === null) {
            $event = new Event();
        }
        if ($event->sender === null) {
            $event->sender = $this;
        }
        $event->handled = false;
        $event->name = $name;
        foreach ($eventHandlers as $handler) {
            $event->data = $handler[1];
            call_user_func($handler[0], $event);
            // stop further handling if the event is handled
            if ($event->handled) {
                return;
            }
        }
    }
    // invoke class-level attached handlers
    Event::trigger($this, $name, $event);
}

            
unlink() 公共方法

定义于: yii\db\BaseActiveRecord::unlink()

销毁两个模型之间的关系。

如果 $deletetrue,则将删除具有关系外键的模型。否则,外键将设置为 null,模型将在不进行验证的情况下保存。

public void unlink ( $name, $model, $delete false )
$name string

关系的区分大小写名称,例如,对于通过 getOrders() 方法定义的关系,为 orders

$model yii\db\ActiveRecordInterface

要从当前模型中取消链接的模型。您必须确保模型确实与当前模型相关,因为此方法不会检查这一点。

$delete boolean

是否删除包含外键的模型。如果为 false,则模型的外键将设置为 null 并保存。如果为 true,则包含外键的模型将被删除。

抛出 yii\base\InvalidCallException

如果模型无法取消链接

抛出 yii\db\Exception
抛出 yii\db\StaleObjectException

unlinkAll() 公共方法

定义于: yii\db\BaseActiveRecord::unlinkAll()

销毁当前模型中的关系。

如果 $deletetrue,则将删除具有关系外键的模型。否则,外键将设置为 null,模型将在不进行验证的情况下保存。

注意,要销毁关系而不删除记录,请确保您的键可以设置为 null

public void unlinkAll ( $name, $delete false )
$name string

关系的区分大小写名称,例如,对于通过 getOrders() 方法定义的关系,为 orders

$delete boolean

是否删除包含外键的模型。

注意,删除将使用 deleteAll() 执行,这不会触发相关模型上的任何事件。如果您需要触发 EVENT_BEFORE_DELETEEVENT_AFTER_DELETE,则需要先 查找 模型,然后对每个模型调用 delete()

                public function unlinkAll($name, $delete = false)
{
    /* @var $relation ActiveQueryInterface|ActiveQuery */
    $relation = $this->getRelation($name);
    if ($relation->via !== null) {
        if (is_array($relation->via)) {
            /* @var $viaRelation ActiveQuery */
            list($viaName, $viaRelation) = $relation->via;
            $viaClass = $viaRelation->modelClass;
            unset($this->_related[$viaName]);
        } else {
            $viaRelation = $relation->via;
            $viaTable = reset($relation->via->from);
        }
        $condition = [];
        $nulls = [];
        foreach ($viaRelation->link as $a => $b) {
            $nulls[$a] = null;
            $condition[$a] = $this->$b;
        }
        if (!empty($viaRelation->where)) {
            $condition = ['and', $condition, $viaRelation->where];
        }
        if (property_exists($viaRelation, 'on') && !empty($viaRelation->on)) {
            $condition = ['and', $condition, $viaRelation->on];
        }
        if (is_array($relation->via)) {
            /* @var $viaClass ActiveRecordInterface */
            if ($delete) {
                $viaClass::deleteAll($condition);
            } else {
                $viaClass::updateAll($nulls, $condition);
            }
        } else {
            /* @var $viaTable string */
            /* @var $command Command */
            $command = static::getDb()->createCommand();
            if ($delete) {
                $command->delete($viaTable, $condition)->execute();
            } else {
                $command->update($viaTable, $nulls, $condition)->execute();
            }
        }
    } else {
        /* @var $relatedModel ActiveRecordInterface */
        $relatedModel = $relation->modelClass;
        if (!$delete && count($relation->link) === 1 && is_array($this->{$b = reset($relation->link)})) {
            // relation via array valued attribute
            $this->$b = [];
            $this->save(false);
        } else {
            $nulls = [];
            $condition = [];
            foreach ($relation->link as $a => $b) {
                $nulls[$a] = null;
                $condition[$a] = $this->$b;
            }
            if (!empty($relation->where)) {
                $condition = ['and', $condition, $relation->where];
            }
            if (property_exists($relation, 'on') && !empty($relation->on)) {
                $condition = ['and', $condition, $relation->on];
            }
            if ($delete) {
                $relatedModel::deleteAll($condition);
            } else {
                $relatedModel::updateAll($nulls, $condition);
            }
        }
    }
    unset($this->_related[$name]);
}

            
update() 公共方法

将对此活动记录的更改保存到关联的数据库表中。

此方法按顺序执行以下步骤

  1. $runValidationtrue 时,调用 beforeValidate()。如果 beforeValidate() 返回 false,则将跳过其余步骤;
  2. $runValidationtrue 时,调用 afterValidate()。如果验证失败,则将跳过其余步骤;
  3. 调用 beforeSave()。如果 beforeSave() 返回 false,则将跳过其余步骤;
  4. 将记录保存到数据库中。如果失败,将跳过其余步骤;
  5. 调用 afterSave()

在上面的步骤 1、2、3 和 5 中,事件 EVENT_BEFORE_VALIDATEEVENT_AFTER_VALIDATEEVENT_BEFORE_UPDATEEVENT_AFTER_UPDATE 将由相应的方法触发。

只有 已更改的属性值 将保存到数据库中。

例如,更新客户记录

$customer = Customer::findOne($id);
$customer->name = $name;
$customer->email = $email;
$customer->update();

请注意,更新可能不会影响表中的任何行。在这种情况下,此方法将返回 0。因此,您应该使用以下代码来检查 update() 是否成功

if ($customer->update() !== false) {
    // update successful
} else {
    // update failed
}
public integer|false update ( $runValidation true, $attributeNames null )
$runValidation boolean

是否在保存记录之前执行验证(调用 validate())。默认为 true。如果验证失败,记录将不会保存到数据库,此方法将返回 false

$attributeNames array|null

需要保存的属性列表。默认为 null,这意味着将保存从 DB 加载的所有属性。

return integer|false

受影响的行数,如果验证失败或 beforeSave() 停止更新过程,则为 false。

抛出 yii\db\StaleObjectException

如果 乐观锁 已启用且要更新的数据已过期。

抛出 Throwable

在更新失败的情况下。

                public function update($runValidation = true, $attributeNames = null)
{
    if ($runValidation && !$this->validate($attributeNames)) {
        Yii::info('Model not updated due to validation error.', __METHOD__);
        return false;
    }
    if (!$this->isTransactional(self::OP_UPDATE)) {
        return $this->updateInternal($attributeNames);
    }
    $transaction = static::getDb()->beginTransaction();
    try {
        $result = $this->updateInternal($attributeNames);
        if ($result === false) {
            $transaction->rollBack();
        } else {
            $transaction->commit();
        }
        return $result;
    } catch (\Exception $e) {
        $transaction->rollBack();
        throw $e;
    } catch (\Throwable $e) {
        $transaction->rollBack();
        throw $e;
    }
}

            
updateAll() 公共静态方法

使用提供的属性值和条件更新整个表。

例如,将所有状态为 2 的客户的状态更改为 1

Customer::updateAll(['status' => 1], 'status = 2');

警告:如果您未指定任何条件,此方法将更新表中的所有行。

请注意,此方法不会触发任何事件。如果您需要触发 EVENT_BEFORE_UPDATEEVENT_AFTER_UPDATE,您需要首先 查找 模型,然后对每个模型调用 update()。例如,上面示例的等效项将是

$models = Customer::find()->where('status = 2')->all();
foreach ($models as $model) {
    $model->status = 1;
    $model->update(false); // skipping validation as no user input is involved
}

对于大量的模型,您可以考虑使用yii\db\ActiveQuery::each()来控制内存使用量。

public static integer updateAll ( $attributes, $condition '', $params = [] )
$attributes array

要保存到表的属性值(名称-值对)。

$condition public void loadRelations ( $relationNames, $asArray false )

将放在 UPDATE SQL 的 WHERE 部分中的条件。有关如何指定此参数,请参阅 yii\db\Query::where()

$params array

要绑定到查询的参数(名称 => 值)。

return integer

更新的行数

                public static function updateAll($attributes, $condition = '', $params = [])
{
    $command = static::getDb()->createCommand();
    $command->update(static::tableName(), $attributes, $condition, $params);
    return $command->execute();
}

            
updateAllCounters() 公共静态方法

使用提供的计数器更改和条件更新整个表。

例如,将所有客户的年龄增加 1,

Customer::updateAllCounters(['age' => 1]);

请注意,此方法不会触发任何事件。

public static integer updateAllCounters ( $counters, $condition '', $params = [] )
$counters array

要更新的计数器(属性名称 => 增量值)。如果您想减少计数器,请使用负值。

$condition public void loadRelations ( $relationNames, $asArray false )

将放在 UPDATE SQL 的 WHERE 部分中的条件。有关如何指定此参数,请参阅 yii\db\Query::where()

$params array

要绑定到查询的参数(名称 => 值)。不要将参数命名为 :bp0:bp1 等,因为它们在此方法内部使用。

return integer

更新的行数

                public static function updateAllCounters($counters, $condition = '', $params = [])
{
    $n = 0;
    foreach ($counters as $name => $value) {
        $counters[$name] = new Expression("[[$name]]+:bp{$n}", [":bp{$n}" => $value]);
        $n++;
    }
    $command = static::getDb()->createCommand();
    $command->update(static::tableName(), $counters, $condition, $params);
    return $command->execute();
}

            
updateAttributes() 公共方法

定义于: yii\db\BaseActiveRecord::updateAttributes()

更新指定的属性。

此方法是 update() 的快捷方式,当不需要数据验证并且只需要更新少量属性时。

您可以将要更新的属性指定为名称列表或名称-值对。如果是后者,相应的属性值将相应地修改。然后,该方法将把指定的属性保存到数据库中。

请注意,此方法不会执行数据验证,并且不会触发事件。

public integer updateAttributes ( $attributes )
$attributes array

要更新的属性(名称或名称-值对)。

return integer

受影响的行数。

                public function updateAttributes($attributes)
{
    $attrs = [];
    foreach ($attributes as $name => $value) {
        if (is_int($name)) {
            $attrs[] = $value;
        } else {
            $this->$name = $value;
            $attrs[] = $name;
        }
    }
    $values = $this->getDirtyAttributes($attrs);
    if (empty($values) || $this->getIsNewRecord()) {
        return 0;
    }
    $rows = static::updateAll($values, $this->getOldPrimaryKey(true));
    foreach ($values as $name => $value) {
        $this->_oldAttributes[$name] = $this->_attributes[$name];
    }
    return $rows;
}

            
updateCounters() 公共方法

定义于: yii\db\BaseActiveRecord::updateCounters()

更新当前 AR 对象的一个或多个计数器列。

请注意,此方法与 updateAllCounters() 不同,因为它只保存当前 AR 对象的计数器。

使用方法示例如下

$post = Post::findOne($id);
$post->updateCounters(['view_count' => 1]);

另请参阅 updateAllCounters()

public boolean updateCounters ( $counters )
$counters array

要更新的计数器(属性名称 => 增量值)。如果您想减少计数器,请使用负值。

return boolean

保存是否成功

                public function updateCounters($counters)
{
    if (static::updateAllCounters($counters, $this->getOldPrimaryKey(true)) > 0) {
        foreach ($counters as $name => $value) {
            if (!isset($this->_attributes[$name])) {
                $this->_attributes[$name] = $value;
            } else {
                $this->_attributes[$name] += $value;
            }
            $this->_oldAttributes[$name] = $this->_attributes[$name];
        }
        return true;
    }
    return false;
}

            
updateInternal() 受保护方法
protected integer|false updateInternal ( $attributes null )
$attributes array|null

要更新的属性

return integer|false

受影响的行数,如果 beforeSave() 停止更新过程,则为 false。

抛出 yii\db\StaleObjectException

                protected function updateInternal($attributes = null)
{
    if (!$this->beforeSave(false)) {
        return false;
    }
    $values = $this->getDirtyAttributes($attributes);
    if (empty($values)) {
        $this->afterSave(false, $values);
        return 0;
    }
    $condition = $this->getOldPrimaryKey(true);
    $lock = $this->optimisticLock();
    if ($lock !== null) {
        $values[$lock] = $this->$lock + 1;
        $condition[$lock] = $this->$lock;
    }
    // We do not check the return value of updateAll() because it's possible
    // that the UPDATE statement doesn't change anything and thus returns 0.
    $rows = static::updateAll($values, $condition);
    if ($lock !== null && !$rows) {
        throw new StaleObjectException('The object being updated is outdated.');
    }
    if (isset($values[$lock])) {
        $this->$lock = $values[$lock];
    }
    $changedAttributes = [];
    foreach ($values as $name => $value) {
        $changedAttributes[$name] = isset($this->_oldAttributes[$name]) ? $this->_oldAttributes[$name] : null;
        $this->_oldAttributes[$name] = $value;
    }
    $this->afterSave(false, $changedAttributes);
    return $rows;
}

            
validate() 公共方法

定义于: yii\base\Model::validate()

执行数据验证。

此方法执行适用于当前 $scenario 的验证规则。以下标准用于确定规则当前是否适用

  • 该规则必须与当前场景相关的属性相关联;
  • 这些规则必须对当前场景有效。

此方法将在实际验证之前和之后分别调用 beforeValidate()afterValidate()。如果 beforeValidate() 返回 false,则验证将被取消,并且不会调用 afterValidate()

验证期间发现的错误可以通过 getErrors()getFirstErrors()getFirstError() 检索。

public boolean validate ( $attributeNames null, $clearErrors true )
$attributeNames string[]|string|null

应该验证的属性名称或属性名称列表。如果此参数为空,则意味着应该验证适用验证规则中列出的任何属性。

$clearErrors boolean

是否在执行验证之前调用 clearErrors()

return boolean

验证是否在没有任何错误的情况下成功。

抛出 yii\base\InvalidArgumentException

如果当前场景未知。

                public function validate($attributeNames = null, $clearErrors = true)
{
    if ($clearErrors) {
        $this->clearErrors();
    }
    if (!$this->beforeValidate()) {
        return false;
    }
    $scenarios = $this->scenarios();
    $scenario = $this->getScenario();
    if (!isset($scenarios[$scenario])) {
        throw new InvalidArgumentException("Unknown scenario: $scenario");
    }
    if ($attributeNames === null) {
        $attributeNames = $this->activeAttributes();
    }
    $attributeNames = (array)$attributeNames;
    foreach ($this->getActiveValidators() as $validator) {
        $validator->validateAttributes($this, $attributeNames);
    }
    $this->afterValidate();
    return !$this->hasErrors();
}

            
validateMultiple() 公共静态方法

定义于: yii\base\Model::validateMultiple()

验证多个模型。

此方法将验证每个模型。正在验证的模型可以是相同类型或不同类型。

public static boolean validateMultiple ( $models, $attributeNames null )
$models array

要验证的模型

$attributeNames array|null

应该验证的属性名称列表。如果此参数为空,则意味着应该验证适用验证规则中列出的任何属性。

return boolean

所有模型是否有效。如果一个或多个模型存在验证错误,则返回 False。

                public static function validateMultiple($models, $attributeNames = null)
{
    $valid = true;
    /* @var $model Model */
    foreach ($models as $model) {
        $valid = $model->validate($attributeNames) && $valid;
    }
    return $valid;
}