Yii2.0.10 新增AR行为-AttributeTypecastBehavior [基础教程]

作者:上班偷偷打酱油 发布于:2016-10-29 浏览:597次 收藏

简介

AttributeTypecastBehavior 提供了一个自动转换模型属性格式的行为。

这种行为对于无模式的数据库(MongoDB或Redis)是非常有用的。

他也能保证[[\yii\db\ActiveRecord]] 或者 [[\yii\base\Model]]在模型验证后严格的属性类型

此行为应该继承 [[\yii\base\Model]] 或 [[\yii\db\BaseActiveRecord]]。

当然你可以通过[[attributeTypes]]为每个属性指定确切的类型

举个例子:

use yii\behaviors\AttributeTypecastBehavior;
class Item extends \yii\db\ActiveRecord
{
    public function behaviors()
    {
        return [
            'typecast' => [
                'class' => AttributeTypecastBehavior::className(),
                'attributeTypes' => [
                    'amount' => AttributeTypecastBehavior::TYPE_INTEGER,
                    'price' => AttributeTypecastBehavior::TYPE_FLOAT,
                    'is_active' => AttributeTypecastBehavior::TYPE_BOOLEAN,
                ],
                'typecastAfterValidate' => true,
                'typecastBeforeSave' => false,
                'typecastAfterFind' => false,
            ],
        ];
    }
    // ...
}

提示:如果你不配置[[attributeTypes]] - 在这种情况下它的值将被自动检测基于模型原有的验证规则。

以下的例子,与上述的配置有相同的效果

use yii\behaviors\AttributeTypecastBehavior;
class Item extends \yii\db\ActiveRecord
{
    public function rules()
    {
        return [
            ['amount', 'integer'],
            ['price', 'number'],
            ['is_active', 'boolean'],
        ];
    }
    public function behaviors()
    {
        return [
            'typecast' => [
                'class' => AttributeTypecastBehavior::className(),
                // 'attributeTypes' 会根据 `rules()`自动生成
            ],
        ];
    }
    // ...
}

在以下情况,该行为会被自动启用

- 通过模型验证之后

- 在数据保存之前(insert 或 update)

- 数据查询之后(found by query or refreshed)

通过对[[typecastAfterValidate]],[[typecastBeforeSave]] 和 [[typecastAfterFind]]的配置,可以控制该行为的执行

默认该行为的只在模型验证通过之后执行

提示:你可以通过[[typecastAttributes()]]手动触发类型转换的行为

$model = new Item();
$model->price = '38.5';
$model->is_active = 10;
$model->typecastAttributes();
print_r($model->attributes);

输出的结果:

Array
(
    [price] => 38.5
    [is_active] => 1   //可以看到这里10被强制转换成了boolean型的1
    ...
)

具体的用法可以参考本文自行尝试,效果会更好哦!

如果文章对您有所帮助,希望继续支持我们,您的支持是我们最大的动力 ¥打赏
声明:文章内容由作者原创或整理,未经允许,不得转载!
您需要登录后才可以评论。登录 | 立即注册