AttributeTypecastBehavior поведение
  • 457

AttributeTypecastBehavior - установка типов данных ActiveRecord свойств.

Автор: admin | 29 апреля (Вс.) 2018г. в 17ч.33м.

AttributeTypecastBehavior обеспечивает возможность автоматического присваивания атрибутов
модели.

При выборке из базы данных с помощью yii\db\ActiveRecord все атрибуты на основе схемы автоматически
приобразуются к типу данных в php соответствующем тому, как они оприделены в базе данных.
Однако, преобразование типов производиться только в момент заполнения экземпляра ActiveRecord данными
из результата запроса.

Схема содержит информацию о структуре базы данных, типах данных полей, отношений между таблицами.
В общем это карта базы данных, если по простому.

Схема также используется при вставке новых записей в базу данных. Но приведение
типов данных атрибутов не производится.

Бывает так, что в БД поля таблицы в integer, в модели также в правилах валидации integer, а
после выборки данных var_dump показывает например 'id' => string '1', тогда как в БД int.
Yii2 старается конвертировать полученные данные из БД, но не на основе правил валидаций,
а на основе схемы БД.

Чтобы можно было приводить атрибуты к нужным типам данных при вставке в базу используется
yii\behaviors\AttributeTypecastBehavior.
Также такое поведение очень полезно в случае использования ActiveRecord для не имеющих
схемы баз данных, таких как MongoDB или Redis.
use yii\behaviors\AttributeTypecastBehavior;

class Article extends \yii\db\ActiveRecord{

    public function behaviors(){
        return [
            'typecast' => [
                'class' => AttributeTypecastBehavior::className(),
                'attributeTypes' => [
                'view_count' => AttributeTypecastBehavior::TYPE_INTEGER,
                'rating' => AttributeTypecastBehavior::TYPE_FLOAT,
                'is_active' => AttributeTypecastBehavior::TYPE_BOOLEAN,
            ],
            'typecastAfterValidate' => true,
            'typecastBeforeSave' => false,
            'typecastAfterFind' => false,
        
        ];
    }

// ...
}​

Вы можете оставить $attributeTypes пустым - в этом случае его значение будет обнаружено
автоматически в соответствии с правилами валидации модели, в которой поведение
было вызвано.

В следующем примере автоматически будет создано такое же значение атрибута $attributeTypes,
как и в предыдущем примере:

use yii\behaviors\AttributeTypecastBehavior;

class Article extends \yii\db\ActiveRecord{

    public function rules(){
        return [
            ['view_count', 'integer'],
            ['rating', 'number'],
            ['is_active', 'boolean'],
        ];
    }

    public function behaviors(){
        return [
            'typecast' => [
                'class' => AttributeTypecastBehavior::className(),
                // 'attributeTypes' will be composed automatically according to `rules()`
            ],
        ];
    }

// ...
}

Такое поведение позволяет автоматически приписывать атрибут при следующих случаях:

- после успешной проверки модели;
- перед сохранением модели (вставка или обновление);
- после поиска модели (найденной по запросу или обновленной);


Вы можете управлять автоматическим typecasting для конкретного случая, используя поля [[typecastAfterValidate]],
[[typecastBeforeSave]] и [[typecastAfterFind]].


По умолчанию приведение типов будет выполняться только после проверки модели 'typecastAfterFind' => true.

Можно вызывать приведение к типам атрибутов с помощью вызова $model->typecastAttributes():

$model = new Article();
$model->view_count = '39';
$model->rating = 1.5;
$model->typecastAttributes();

Есть четыре типа данных, к которым можно приводить значения при установке 'attributeTypes':

const TYPE_INTEGER = 'integer';
const TYPE_FLOAT = 'float';
const TYPE_BOOLEAN = 'boolean';
const TYPE_STRING = 'string';

Но этого может быть не достаточно. Ведь для того, чтобы установить дату нужен другой тип данных.
Но для таких задач можно использовать функцию обратного вызова.

'attributeTypes' => [
    'view_count' => AttributeTypecastBehavior::TYPE_INTEGER,
    'rating' => AttributeTypecastBehavior::TYPE_FLOAT,
    'is_active' => AttributeTypecastBehavior::TYPE_BOOLEAN,
    'date' => function ($value) {
        return ($value instanceof \DateTime) ? $value->getTimestamp(): (int)$value;
    },
],

Рассмотрим другие свойства, которые доступны для оприделения:

owner - тут хранится модель, в которой установлено поведение. Если нужна другая
модель, то можно переоприделить 'owner' => new Category, .Можно установить любую модель,
производную от yii\base\Model или yii\db\BaseActiveRecord.

skipOnNull (boolean) - Если включенное значение атрибута, равное `null`,
не будет зацикливаться на типе (например,` null` остается `null`)
По умолчанию skipOnNull = true

typecastAfterFind, typecastAfterSave, typecastAfterValidate, typecastBeforeSave рассмотрены нами ранее.
Эти параметрв принимают булево значение и по умолчанию только $typecastAfterValidate = true, остальные
false.

Приветствую!

Меня зовут Сергей. Я - автор этого блога.

Если Вам был полезен материал на моем сайте, поддержите пожалуйста мой проект, чтобы о нем узнали другие люди - кликните plizz :) на иконку в соц. сети, чтобы поделиться материалом с другими.