Как инициализировать объект значениями из базы?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
mbp64
Сообщения: 4
Зарегистрирован: 2014.09.12, 11:29

Как инициализировать объект значениями из базы?

Сообщение mbp64 »

Добрый день.
У меня есть модель
class MyClass extends ActiveRecord {

}
При создании объекта в таблице создается пустая запись.
$MyClass = new MyClass();
Как заполнить создаваемый класс значениями из таблицы, если известен идентификатор записи?
Мне нужно или добавить конструктор, или изменить его поведение, так, чтобы
можно было или создать новую пустую запись, или получить новый экземпляр класса, заполненный
значениями из базы, если задан идентификатор записи.
$object = new MyClass($id);
Извините, что немного невнятно объясняю, устал за день.
mbp64
Сообщения: 4
Зарегистрирован: 2014.09.12, 11:29

Re: Как инициализировать объект значениями из базы?

Сообщение mbp64 »

Немного не то, я знаю, как считывать данные.
Мне нужно иметь возможность либо создавать запись при создании объекта, либо создавать неинициализированный объект без создания записи.
Как можно управлять поведением конструктора?
HQ0
Сообщения: 182
Зарегистрирован: 2012.10.17, 17:21

Re: Как инициализировать объект значениями из базы?

Сообщение HQ0 »

создавать запись при создании объекта
зачем такое тебе, когда есть save?
создавать неинициализированный объект без создания записи
а как вообще можно _создать не инициализированный объект_ ?
SpleenUa
Сообщения: 46
Зарегистрирован: 2011.07.08, 12:56

Re: Как инициализировать объект значениями из базы?

Сообщение SpleenUa »

а как вообще можно _создать не инициализированный объект_ ?
я так понимаю речь идет об объекте с пустыми значениями атрибутов

Но тем не меннее все это странно, тут явно проблемы с логикой работы.
Пока не объяснят чем не устраивает $model= new MyClass(); $model->save(); что-то говорить нет смысла.
mbp64
Сообщения: 4
Зарегистрирован: 2014.09.12, 11:29

Re: Как инициализировать объект значениями из базы?

Сообщение mbp64 »

save здесь не катит, потому, что мне еще нечего сохранять, наоборот, нужно либо создать новую запись и начать с ней работать,
либо прочитать уже существующую и присвоить ее значения полям создаваемого объекта,
save я делаю в конце, после всех изменений.
Проблема в том, что конструктор в любом случае создает запись в базе, даже когда это и не нужно.

Вот так примерно:

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

/*  проверяю, известен ли идентификатор записи */
if(!is_set($id)) {  // id неизвестен:
  $rec = new MyClass(); // здесь создается экземпляр класса и новая запись, это случай, когда мне неизвестен id записи
} else {  /* а вот здесь мне нужно создать экземпляр класса, но так, чтобы он _не_создавал_ (!!!) запись в базе, 
                эта запись _уже_существует_и_ее_id_записи_мне_известен, 
                нужно _только_ прочитать значения ее полей, присвоить объекту и работать с ним дальше  */
}
/* здесь работаю с  объектом, изменяю его значения итп */
$rec->field1 = $var1;  // etc
/* сохраняю изменения */
$rec->save();


Мне нужно иметь возможность выбирать, создавать ли новую запись при вызове конструктора, или работать с существующей, когда известен ее идентификатор в базе.
Можно, в принципе, тупо вызвать конструктор, удалить создавшуюся запись, прочитать данные из нужной мне записи и присвоить их полям созданного объекта,
но это костыль. Можно как-нибудь без создания записи, если она уже есть и у меня есть ее ID?

Когда я распечатываю print_r'ом созданные объект, там есть такое поле:

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

 [_scenario:CModel:private] => insert
Может, можно здесь как-то изменить поведение конструктора?
HQ0
Сообщения: 182
Зарегистрирован: 2012.10.17, 17:21

Re: Как инициализировать объект значениями из базы?

Сообщение HQ0 »

Проблема в том, что конструктор в любом случае создает запись в базе, даже когда это и не нужно.
Я точно знаю, что пока не save() записи в базе не будет.
Аватара пользователя
mihail_dev
Сообщения: 243
Зарегистрирован: 2013.07.17, 00:51
Откуда: Молдова
Контактная информация:

Re: Как инициализировать объект значениями из базы?

Сообщение mihail_dev »

я думаю ва м неплохо для начала прочитать это

http://www.yiiframework.com/doc-2.0/gui ... odels.html - про модели и валидацию наднных
потом это http://www.yiiframework.com/doc-2.0/gui ... llers.html - про обработку запросов
и далее как ранее и говорилось разобраться с активрекорд http://www.yiiframework.com/doc-2.0/gui ... ecord.html
он является наследником класса моделей и валидация проходит абсолютно также

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

для лучшего понимания сделайте тестовую таблицу в бд и воспользуйтесь генератором моделей и генератором контроллера он вам сформирует все основные действия над записями (просмотр создание обновление удаление) также сделает вюхи вы сможете понять основу работы с ар и обработку запросов
http://www.yiiframework.com/doc-2.0/gui ... t-gii.html
Изображение
Ответить