ActiveRecord, автоматическое заполнение

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Ramix
Сообщения: 26
Зарегистрирован: 2012.07.18, 16:19

ActiveRecord, автоматическое заполнение

Сообщение Ramix »

Всем привет, по ходу изучения Yii возник такой вопрос. Например, есть

экшн

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

public function actionIndex()
{
    $model = new MyModel();

    if(isset($_POST['MyModel']))
    {
        $model ->attributes = $_POST['MyModel'];

        if($model ->validate())
        {
             $model->doSomething();
        }
    }

} 
модель

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

class MyModel extends CActiveRecord
{  
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    public function tableName()
    {
        return '{{mymodel_table}}';
    }
    
    public function rules()
    {
        return array(
            array('id', 'required'),
            array('id', 'length', 'min'=>1, 'max'=>11),

        );
    }

    public function doSomething()
    {
        // поле $this->id - работает, потому что пришло из формы
        // поле $this->myfield - не работает, хотя это поле в таблице БД
    }
}
Как сделать и вообще есть ли способ, чтобы после валидации ($model ->validate()), в объекте $model оказалось все содержимое строки из БД с primary key из id, который я подбросил модели?
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: ActiveRecord, автоматическое заполнение

Сообщение futbolim »

выбирете, появится. а зачем Вам это нужно ?
Ramix
Сообщения: 26
Зарегистрирован: 2012.07.18, 16:19

Re: ActiveRecord, автоматическое заполнение

Сообщение Ramix »

Для удобства, чтобы эту же модель сразу использовать и для валидации, и для добавления строки в базу, например. Вы имеете ввиду этот способ?

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

public function afterValidation()
{
    $model = $this->findByPk($this->id);
    $this->myfield = $model->myfield;
}
Я его рассматривал, но предполагал, что это можно сделать удобнее, загрузить все поля конкретной строки сразу.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: ActiveRecord, автоматическое заполнение

Сообщение futbolim »

я имел ввиду

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

if($model ->validate())
{
       $model->save(false);
}
// и выбираем
$model->findByPk($id);
 
Может я что то не так понял ?
Ramix
Сообщения: 26
Зарегистрирован: 2012.07.18, 16:19

Re: ActiveRecord, автоматическое заполнение

Сообщение Ramix »

Так и буду делать, спасибо
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: ActiveRecord, автоматическое заполнение

Сообщение yiijeka »

чтобы после валидации ($model ->validate()), в объекте $model оказалось все содержимое строки из БД с primary key из id
Можно использовать метод getPrimaryKey

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

public function actionIndex()
{
    $model = new MyModel();

    if(isset($_POST['MyModel']))
    {
        $model ->attributes = $_POST['MyModel'];

        if($model ->save())
        {
             $model->id=$model->getPrimaryKey();
             // Делаем что-то
             // Проверяем $model->validate()
             // Сохраняем $model->update()
        }
    }
}
 
Только я так и не понял для чего это действительно нужно.
Для удобства, чтобы эту же модель сразу использовать и для валидации, и для добавления строки в базу, например
$model всегда останется той же самой, что после валидации, что перед валидацией. После добавления в базу к ней добавиться только один раз первичный ключ, когда будет произведён первый вызов save() и при последующих сохранениях логично использовать validate() и затем update()
Ramix
Сообщения: 26
Зарегистрирован: 2012.07.18, 16:19

Re: ActiveRecord, автоматическое заполнение

Сообщение Ramix »

То есть после save() в $model автоматически загрузится информация из всех колонок конкретной строки?
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: ActiveRecord, автоматическое заполнение

Сообщение Ryadnov »

Ramix, Вы что пытаетесь сделать? объединить экшены Create и Update в один?
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: ActiveRecord, автоматическое заполнение

Сообщение yiijeka »

Ramix писал(а):То есть после save() в $model автоматически загрузится информация из всех колонок конкретной строки?
Нет, после save() ничего автоматически в $model не грузиться. Подробнее, что происходит с $model во время save() можно посмотреть в api. Если вам нужно что-либо сделать с $model после save() есть метод afterSave(), который можно использовать в файле модели. Ещё можно использовать behaviors, но сначала нужно с основами разобраться ;)
Ramix
Сообщения: 26
Зарегистрирован: 2012.07.18, 16:19

Re: ActiveRecord, автоматическое заполнение

Сообщение Ramix »

Ryadnov писал(а):Ramix, Вы что пытаетесь сделать? объединить экшены Create и Update в один?
Я хотел, чтобы после валидации присланного из формы id'шника, в объект этой формы, который также работает и с таблицей бд, загрузилось всё содержимое из всех колонок конкретной строки (по опять же присланному id). Чтобы не нужно было отдельно делать findByPk
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: ActiveRecord, автоматическое заполнение

Сообщение lancecoder »

смысл? если вы чтото записываете значит у вас есть это в атрибуте, если есть в атрибуте будет и в моделе, если чтото в атрибуте модели нет, по дефолту присваивает таблица, то вы наверняка знаете дефолт :)
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: ActiveRecord, автоматическое заполнение

Сообщение Ryadnov »

Ramix писал(а):
Ryadnov писал(а):Ramix, Вы что пытаетесь сделать? объединить экшены Create и Update в один?
Я хотел, чтобы после валидации присланного из формы id'шника, в объект этой формы, который также работает и с таблицей бд, загрузилось всё содержимое из всех колонок конкретной строки (по опять же присланному id). Чтобы не нужно было отдельно делать findByPk
Чисто по вашей проблеме есть http://www.yiiframework.com/doc/api/1.1 ... esh-detail

просто для интереса, вы пробовали сохранять (обновлять) уже существующую запись?
и как вы проверяете id ?
Ramix
Сообщения: 26
Зарегистрирован: 2012.07.18, 16:19

Re: ActiveRecord, автоматическое заполнение

Сообщение Ramix »

lancecoder писал(а):смысл? если вы чтото записываете значит у вас есть это в атрибуте, если есть в атрибуте будет и в моделе, если чтото в атрибуте модели нет, по дефолту присваивает таблица, то вы наверняка знаете дефолт :)
Все верно, но присылаю из формы и, соответственно, валидирую я только поле id (primary key), а кроме поля id в таблице есть поле myfield, которое из формы не идет. И после валидации, в конкретном объекте модели оно будет неопределено. Получается, валидировался id нормально, строка в базе нашлась, но в модели заполнился только id (который и валидировался до этого), соответственно, модель неполная (myfield нельзя вызвать). Выходит, нужно вызывать findByPk, чтобы получить уже ВСЕ поля конкретной строки, по валидированному id.
Ramix
Сообщения: 26
Зарегистрирован: 2012.07.18, 16:19

Re: ActiveRecord, автоматическое заполнение

Сообщение Ramix »

Ryadnov писал(а):
Ramix писал(а):
Ryadnov писал(а):Ramix, Вы что пытаетесь сделать? объединить экшены Create и Update в один?
Я хотел, чтобы после валидации присланного из формы id'шника, в объект этой формы, который также работает и с таблицей бд, загрузилось всё содержимое из всех колонок конкретной строки (по опять же присланному id). Чтобы не нужно было отдельно делать findByPk
Чисто по вашей проблеме есть http://www.yiiframework.com/doc/api/1.1 ... esh-detail

просто для интереса, вы пробовали сохранять (обновлять) уже существующую запись?
и как вы проверяете id ?
Кажется, это то, что нужно, проверю. При попытке сделать save() вылетает эксепшн, сообщающий, что такой id (primary) уже существует. Update() не пробовал. Существование конкретного id, присланного из формы, проверяется валидатором exist (attributeName => id).
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: ActiveRecord, автоматическое заполнение

Сообщение Ryadnov »

А новые записи вы как добавляете? )

Черти что и сбоку бантик %)))
Ramix
Сообщения: 26
Зарегистрирован: 2012.07.18, 16:19

Re: ActiveRecord, автоматическое заполнение

Сообщение Ramix »

Ryadnov писал(а):А новые записи вы как добавляете? )

Черти что и сбоку бантик %)))
Вообще или в этом случае? :)

В моем примере добавление записей не нужно, это просто чтение по id, присланному из формы
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: ActiveRecord, автоматическое заполнение

Сообщение Ryadnov »

И последующий update?

Грузите просто с использованием findByPk, с вашей валидацией по ID вы только только усложняете и увеличиваете кол-во запросов к базе
Аватара пользователя
mihan007
Сообщения: 31
Зарегистрирован: 2011.01.28, 11:05
Откуда: Санкт-Петербург
Контактная информация:

Re: ActiveRecord, автоматическое заполнение

Сообщение mihan007 »

господа, может я чего не понимаю, но что такое валидация по ID? проверка наличия записи с данным ID в базе? :) зачем?
с уважением,
Куклин Михаил

контакты: +79313601666 | mihan007@ya.ru | https://paradox777.ru
Ramix
Сообщения: 26
Зарегистрирован: 2012.07.18, 16:19

Re: ActiveRecord, автоматическое заполнение

Сообщение Ramix »

mihan007 писал(а):господа, может я чего не понимаю, но что такое валидация по ID? проверка наличия записи с данным ID в базе? :) зачем?
Резонное замечание, действительно можно без нее обойтись :)
Ryadnov писал(а):Грузите просто с использованием findByPk, с вашей валидацией по ID вы только только усложняете и увеличиваете кол-во запросов к базе
++
Ответить