ActiveRecord дополнительные поля в модели

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
mikola123
Сообщения: 42
Зарегистрирован: 2016.04.22, 22:39

ActiveRecord дополнительные поля в модели

Сообщение mikola123 »

Добрый день!
У меня есть класс:

Код: Выделить всё

class Account extends ActiveRecord {
    ...
    //Поле БД
    public $baned_at;
    //Я добавил свойство
    public $baned_check;
}
Когда я получаю модель, допустим:

Код: Выделить всё

$model = Account::find(); 
Можно ли сделать, чтобы при получении или создании модели, поле $model->baned_check было равно is_null($model->baned_at).
Т.е. не присваиванием:

Код: Выделить всё

$model = Account::find(); 
$model->baned_check = is_null($model->baned_at);
А в самой модели при получении, произошли такие действия, по умолчанию.

Спасибо!
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: ActiveRecord дополнительные поля в модели

Сообщение Alexum »

Свойство можно заполнять дефолтным значением при валидации/сохранении через массив rules, а при получении методом afterFInd(). Но лучше сделать отдельный метод $model->isBanned() проверяющий $baned_at - надёжнее (иначе нужно держать в голове, что при любой манипуляции с $baned_at нужно обновить $baned_check). А ещё лучше в БД хранить всё таки конкретный статус, а поля с датой смены статуса и инициатором как вспомогательные.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: ActiveRecord дополнительные поля в модели

Сообщение maleks »

Почитайте про события. Достаточно обработчик для события AFTER_FIND прописать, и он заполнит ваши виртуальные поля
Yii2 universal module sceleton - for basic and advanced templates
mikola123
Сообщения: 42
Зарегистрирован: 2016.04.22, 22:39

Re: ActiveRecord дополнительные поля в модели

Сообщение mikola123 »

Спасибо, ответы помогли!
Сделал вот так:

Код: Выделить всё

public function behaviors()
    {
        $behaviour = 
        [
            [
                'class' => AttributeBehavior::className(),
                'attributes' => [
                    self::EVENT_AFTER_FIND => 'baned_check',
                ],
                'value' => function ($event) {
                    return !is_null($this->baned_at) && $this->baned_at !== 0;
                },
            ],
            [
                'class' => AttributeBehavior::className(),
                'attributes' => [
                    self::EVENT_BEFORE_INSERT => ['baned_at'],
                    self::EVENT_BEFORE_UPDATE => ['baned_at'],
                ],
                'value' => function ($event) {
                    if ($this->baned_check) {
                        if (empty($this->baned_at)) {
                            return date('U');
                        } else {
                            return $this->baned_at;
                        }
                    } else {
                        return NULL;
                    }
                },
            ],
        ];

        return ArrayHelper::merge(parent::behaviors(), $behaviour);
    }
Закрыто