@jekahm

Каким образом и где определяется свойство isNewRecord класса BaseActiveRecord в Yii2?

Доброго времени суток!
В данный момент занимаюсь изучением Yii2 и столкнулся с такой трудностью.
При генерации CRUD через Gii согласно оф. документации обнаружил в подключаемом файле представления views/country/_form.php, что состояние кнопки Create/Update меняется, исходя из значения свойства isNewRecord класса BaseActiveRecord.
Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary'])

Как я понимаю, при этом происходит вызов соответсвующего геттера getIsNewRecord(),
public function getIsNewRecord()
    {
        return $this->_oldAttributes === null;
    }

где в свою очередь проверяется очередное свойство $_oldAttributes.
Но вот где и как устанавливается последнее свойство, я так и не сообразил.
Буду очень признателен, если кто-нибудь обьяснит, что же происходит далее в этой цепочке.
Заранее благодарен за ответ!
  • Вопрос задан
  • 4534 просмотра
Решения вопроса 1
@SilverSlice
Сергей Протько всё верно описал. Свойство _oldAttributes используется для реализации dirty attributes.

  • При выборке данных, например методом findOne(), строка из БД преобразуется в объект AR методом BaseActiveRecord::populateRecord(). В значение свойств _attributes и _oldAttributes записываются данные, полученные из БД, в виде ['columnName' => 'value'].

  • При установке атрибутов ($customer->name = 'James') магический метод BaseActiveRecord::__set() модифицирует свойство _attributes.

  • При сохранении записи метод BaseActiveRecord::updateInternal() получает только измененные атрибуты (сравнивая свойства _attributes и _oldAttributes), чтобы обновить в БД лишь нужные поля.

  • По умолчанию свойство _oldAttributes равно null. При создании нового объекта ($customer = new Customer()) оно не изменяется, поэтому на основе его и определяют, является ли запись новой или нет.

Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
это свойство по идее устанавливается сразу после загрузки данных из базы (в oldAttributes и в attributes). Так, перед сохранением мы можем проверить что мы изменили, так как изменениям будет подвержен только attributes. Ну а для новоиспеченной модели oldAttributes всегда будет пустым.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы