AfterSaveEvent $changedAttributes возвращает не измененные данные.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Chelobaka
Сообщения: 128
Зарегистрирован: 2018.06.01, 09:54

AfterSaveEvent $changedAttributes возвращает не измененные данные.

Сообщение Chelobaka » 2019.08.09, 15:11

Здравствуйте.

После сохранения модели в $changedAttributes есть не измененные атрибуты.
В rules модели stock_id - Int, status - int
Почему в changedAttributes есть stock_id котороые не изменен? Подозреваю что из-за стринга но почему переменная в аттрибутах которая Int в _attributes и _oldAttributes строка?
В какой момент int становится строкой?

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

object(yii\db\AfterSaveEvent)#211 (5) {
["changedAttributes"]=>
  array(5) {
        ["name"]=>
        string(1) "1"
        ["stock_id"]=>
        int(6)
        ["comment"]=>
        string(3) "123"
        ["status"]=>
        int(10)
        ["updated_at"]=>
        int(1564660839)
  }
  
  ["name"]=> string(11) "afterUpdate"
  

["sender"]=>
  object(common\models\secret\Secret)#155 (10) {
  ["_attributes":"yii\db\BaseActiveRecord":private]=>

    array(11) {
        ["id"]=>
          int(27)
        ["name"]=>
          string(3) "123"
        ["stock_id"]=>
          string(1) "6"
        ["date"]=>
          int(1566345600)
        ["comment"]=>
          string(4) "1234"
        ["status"]=>
          string(2) "10"
        ["created_at"]=>
          int(1564660839)
        ["updated_at"]=>
          int(1565352014)
    }
    ["_oldAttributes":"yii\db\BaseActiveRecord":private]=>

    array(11) { 
        ["id"]=>
          int(27)
        ["name"]=>
          string(3) "123"
        ["stock_id"]=>
          string(1) "6"
        ["date"]=>
          int(1566345600)
        ["comment"]=>
          string(4) "1234"
        ["status"]=>
          string(2) "10"
        ["created_at"]=>
          int(1564660839)
        ["updated_at"]=>
          int(1565352014)
    }
    
    

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

Re: AfterSaveEvent $changedAttributes возвращает не измененные данные.

Сообщение Alexum » 2019.08.09, 15:37

В БД у этих полей какой тип? Поля модели могут заполняться строками например при загрузке модели из POST в контроллере $model->load(Yii::$app->request->post().

Аватара пользователя
Chelobaka
Сообщения: 128
Зарегистрирован: 2018.06.01, 09:54

Re: AfterSaveEvent $changedAttributes возвращает не измененные данные.

Сообщение Chelobaka » 2019.08.09, 15:39

Alexum писал(а):
2019.08.09, 15:37
В БД у этих полей какой тип? Поля модели могут заполняться строками например при загрузке модели из POST в контроллере $model->load(Yii::$app->request->post().
Спасибо за ответ. Да, данные грузятся так (из POST из ActiveFrom);
Но как избежать сохранения не измененных полей? Кроме перебора в цикле этих массивов. Возможно есть вариант восстановления типа?

В базе int(11) оба поля, status, stock_id

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

Re: AfterSaveEvent $changedAttributes возвращает не измененные данные.

Сообщение Alexum » 2019.08.09, 15:56

Можно через фильтр в массиве rules

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

[[...массив имён интовых атрибутов...], 'filter', 'filter' => function ($value) {
      return $value !== null && $value !== '' ? (int)$value : null;
}],

yiiliveext
Сообщения: 167
Зарегистрирован: 2019.08.13, 01:49

Re: AfterSaveEvent $changedAttributes возвращает не измененные данные.

Сообщение yiiliveext » 2019.08.16, 22:46

Alexum писал(а):
2019.08.09, 15:56
Можно через фильтр в массиве rules

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

[[...массив имён интовых атрибутов...], 'filter', 'filter' => function ($value) {
      return $value !== null && $value !== '' ? (int)$value : null;
}],
Если поля not null, как fk, например, то проще записывать 'filter' => 'intval'

Ответить