Как задать дефолтные значения для AR при создании объекта?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Как задать дефолтные значения для AR при создании объекта?

Сообщение i-programmer »

Если в AR модели в rules прописать строки

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

[['k'], 'default', 'value' => 123],
[['v'], 'default', 'value' => '666'],
То только лишь при вызове метода validate() у модели, дефолтные значения указанных полей запишутся в объект.

А как сделать так, чтобы они записывались без вызова этого метода, т.е. сразу при создании модели например через `new MyModelName` или через `Yii::createObject` ?


Вариант указать в виртуальных полях не оч., потому что получается дублирование как в виртуальных полях, так и в правилах и в итоге потом всё перемешается
Аватара пользователя
SiZE
Сообщения: 2813
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Как задать дефолтные значения для AR при создании объекта?

Сообщение SiZE »

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

    public function init()
    {
        parent::init();
        $this->k = 1;
        $this->v = 2;
    }
Так же есть метод loadDefaultValues
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Как задать дефолтные значения для AR при создании объекта?

Сообщение i-programmer »

SiZE писал(а): 2022.04.25, 10:23

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

    public function init()
    {
        parent::init();
        $this->k = 1;
        $this->v = 2;
    }
Так же есть метод loadDefaultValues
loadDefaultValues - это чтобы из БД загрузить дефолтные данные в модель. Но нет, наверное, особого смысла дублировать в коде и в БД одно и то же, поэтому используем указание дефолтных значений только в модели.



ПО поводу init: это получается такое же дублирование, как если бы я указал это просто в виртуальных полях значения по умолчанию.
Дублировать тут и в rules довольно странное решение, вам не кажется? Тем более если дефолтных полей, предположим, 5-6, а не 1. ужас же.


Получается, кроме как покопаться в методе validate и переписать что-то подобное и внедрить в init базового класса моделей - выхода нет? Имею в виду то, что при вызове метода validate происходит как раз заполнение дефолтными значениями из rules. Значит в какую-нибудь свою базовую модель приложения в init надо написать подобную логику и наследоваться от этой базовой модели.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Как задать дефолтные значения для AR при создании объекта?

Сообщение maleks »

Нужно в схеме БД указывать дефолтные значения.
Чтобы если например из phpmyadmin и т.д. создал в ручную, тоже работало.
Соответственно и ->loadDefaultValues их подгрузит без дублирования.

А в rules - то о несколько другом, то о форме, если ничего не введено в форме, то подставит их.
Yii2 universal module sceleton - for basic and advanced templates
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Как задать дефолтные значения для AR при создании объекта?

Сообщение i-programmer »

maleks писал(а): 2022.04.27, 07:50 Нужно в схеме БД указывать дефолтные значения.
Чтобы если например из phpmyadmin и т.д. создал в ручную, тоже работало.
Соответственно и ->loadDefaultValues их подгрузит без дублирования.

А в rules - то о несколько другом, то о форме, если ничего не введено в форме, то подставит их.
Я тогда не понимаю зачем нужны default значения в rules у модели, если при сохранении новой записи в БД дефолтные значения для колонок будут прописаны в ней (в БД) самой. Да и вообще можно всегда из БД загрузить дефолтные значения. Можете объяснить зачем тогда нужны те правила?
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Как задать дефолтные значения для AR при создании объекта?

Сообщение maleks »

В том варианте когда модель по сути через форму создается/редактируется, то вот эти default правила могут в принципе решить проблему дефолтных значений, т.к. всегда через валидацию будет проходить.
Yii2 universal module sceleton - for basic and advanced templates
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Как задать дефолтные значения для AR при создании объекта?

Сообщение i-programmer »

maleks писал(а): 2022.04.27, 09:33 В том варианте когда модель по сути через форму создается/редактируется, то вот эти default правила могут в принципе решить проблему дефолтных значений, т.к. всегда через валидацию будет проходить.
Т.е. получается, если используется форма - обязательно валидация и следовательно будет работать заполнение из rules, если данные не пользовательские, но создаю сущность для сохранения - то использовать loadDefaultValues из БД (или через init), так?

Как-то это всё выглядит костыльно. ИМХО проще было сделать сразу заполнение дефолтными значениями при `new Model`;
Аватара пользователя
ElisDN
Сообщения: 5841
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как задать дефолтные значения для AR при создании объекта?

Сообщение ElisDN »

i-programmer писал(а): 2022.04.27, 12:00 ИМХО проще было сделать сразу заполнение дефолтными значениями при `new Model`;
Как раз при вызове new Model() конструктор вызывает метод init()
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Как задать дефолтные значения для AR при создании объекта?

Сообщение i-programmer »

ElisDN писал(а): 2022.04.27, 13:45
i-programmer писал(а): 2022.04.27, 12:00 ИМХО проще было сделать сразу заполнение дефолтными значениями при `new Model`;
Как раз при вызове new Model() конструктор вызывает метод init()
Да, но он из коробки не заполняет дефолтными данными модель. Я написал о том, что "почему бы этого не сделать было во фреймворке изначально?" Что в итоге надо допиливать вещь, которая, как мне кажется, изначально должна быть там. Ведь какой смысл инициализировать пустую модель, если в ней есть дефолтные значения для полей?
unknownby
Сообщения: 747
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Как задать дефолтные значения для AR при создании объекта?

Сообщение unknownby »

i-programmer писал(а): 2022.04.27, 14:43 Да, но он из коробки не заполняет дефолтными данными модель.
Для каких целей вам нужно заполнять дефолтными данными модель? Что вы хотите сделать с дефолтными значениями? Если ничего, то пусть БД сама заполняет эти данные в саму же себя. Зачем сюда ещё фреймворк приплетать?
Однако, если вы собираетесь что-то с ними делать, то вам уже подсказали несколько вариантов решений. :D
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Как задать дефолтные значения для AR при создании объекта?

Сообщение i-programmer »

unknownby писал(а): 2022.04.28, 15:38
i-programmer писал(а): 2022.04.27, 14:43 Да, но он из коробки не заполняет дефолтными данными модель.
Для каких целей вам нужно заполнять дефолтными данными модель? Что вы хотите сделать с дефолтными значениями? Если ничего, то пусть БД сама заполняет эти данные в саму же себя. Зачем сюда ещё фреймворк приплетать?
Ну вот вам как минимум один сценарий: имеется БД, где нельзя указать дефолтные значения. Именно по этой причине существует метод loadDefaultValues, который нужно вызывать самостоятельно, вручную, если используется БД с поддержкой установки дефолтных значений.
Соответственно, предположим, я хочу записать в БД данные, поля в базе NOT NULL. Вопрос: Как установить значения по-умолчанию не переопределяя метод init в 100 моделях? Почему бы эти значения сразу не инициализировать при создании модели?

Другой сценарий похожий на первый, только в этот раз специально было отказано от установки дефолтных значений в БД по некоторым причинам (специфика реализации проекта, не будем углубляться в детали). Поэтому нужно то же действие: установка дефолтных значений сразу при инициализации модели иначе при вызове метода save будет Exception

Третий сценарий: создаю модель, в которую по-умолчанию не будут загружаться пользовательские данные, а я сам, программист, буду туда их заносить и хочу сохранить их в БД. Без валидации. Потому что я себе на 100% доверяю. Пример прост: банально есть операция клонирования сущности, но с определёнными условиями и clone $model не канает. Нужно именно с нуля создать модель и скопировать два-три-четыре поля. При этом чтобы ещё дефолтные записались. Что делать?

При вызове метода validate именно это (занесение дефолтных данных) и происходит. Получается какая-то мутация и двойственное поведение и в целом нарушение принципа SOLID. Потому что происходит не только валидация, но и другая операция, которая мутирует данные.

И раз уже как минимум одна операция есть с установкой значений, не понимаю, почему её нельзя сделать по дефолту, чтобы не чудить с init в каждой модели, loadDefaultValues в каждой модели или validate для каждой модели.
Аватара пользователя
ElisDN
Сообщения: 5841
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как задать дефолтные значения для AR при создании объекта?

Сообщение ElisDN »

i-programmer писал(а): 2022.04.27, 14:43 Да, но он из коробки не заполняет дефолтными данными модель. Я написал о том, что "почему бы этого не сделать было во фреймворке изначально?"
Как раз во фреймворке изначально и придумали универсальный способ добавить пустой метод init(), который любой программист при желании может переопределить чтобы там сконфигурировать объект дефолтными значениями, не переопределяя более сложный конструктор. Это оно и есть.

А loadDefaultValues() и простановка в validate() – это уже малополезная экзотика для конкретной БД и для ввода данных из формы.
Ответить