AfterFind если модель не найдена

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
yupiee
Сообщения: 21
Зарегистрирован: 2011.08.31, 14:25

AfterFind если модель не найдена

Сообщение yupiee »

Есть задача:
Если модель не найдена, то создать ее, дать ей дефолтные значения, сохранить и вернуть. подскажите как правильно это реализовать
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: AfterFind если модель не найдена

Сообщение timlar »

А что значит "модель не найдена"? Может покажешь кусок кода?
Twitter: @timlar_ua
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: AfterFind если модель не найдена

Сообщение SpiLLeR »

Какая-то абстрактная задача, но есть к примеру такая штука CDefaultValidator.
Предупрежден - значит вооружен.
devKP.ru
Vic
Сообщения: 109
Зарегистрирован: 2010.03.12, 01:55

Re: AfterFind если модель не найдена

Сообщение Vic »

yupiee писал(а):Есть задача:
Если модель не найдена, то создать ее, дать ей дефолтные значения, сохранить и вернуть. подскажите как правильно это реализовать
если модель не найдена, то и нет afterFind(), в методе find() написано, что
return CActiveRecord the record found. Null if no record is found
а у Null нет такого метода

А дефолтные значения будут присвоены ( если они для таблицы указаны ) при

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

$obj = new Model; 
ну и далее, как заблагорассудится:

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

/*
// если вдруг что-то другое нужно, чтоб валидацию пройти
$obj->attributes=$arrayDefaults; 
*/
$obj->save();
 
Johnatan
Сообщения: 167
Зарегистрирован: 2010.10.27, 13:06
Откуда: Reino de España

Re: AfterFind если модель не найдена

Сообщение Johnatan »

В контроллере:

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

public function actionGetModel($id)
{
    $model = MyModel::model()->findByPk($id);
    if (!isset($model)) {
        $model = new MyModel('default');
        $model->setDefault();
        $model->save();
        $model->setScenario('update');
    }
    // Делаем что нужно с моделью...
} 
Соответственно в модели создаём метод setDefault()

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

public function setDefault()
{
    if ($this->getScenario() != 'default')
        return;
    $this->attributes = array(
        'id'=>1,
        'name'=>'blahblah'
        // и т.д.
    );
} 
Писал "на коленке", но думаю идея ясна. Сценарии нужны, чтобы применять нужные правила при задании значений по-умолчанию.
Конференция: yii@conference.jabber.ru
taral14
Сообщения: 236
Зарегистрирован: 2011.02.26, 23:48

Re: AfterFind если модель не найдена

Сообщение taral14 »

Добавить в модель метод Model::findOrCreate дальше думаю все понятно
like2dev
Сообщения: 138
Зарегистрирован: 2011.05.13, 12:57
Откуда: Kiev

Re: AfterFind если модель не найдена

Сообщение like2dev »

Думаю, что если эта задача повторима для нескольких моделей. То уже лучше сделай свой ActiveRecord

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

<?php
class DActiveRecord extends CActiveRecord {

    public function find(mixed $condition='', array $params=array ( )) {
        $model = $this->find($condition,$params);
        $model = ($model)?$model:new __CLASS__; // Как-то так

        if($model->isNewRecord)
            $model->setAttributes($this->defaultAttributes());

        return $model;
    }

    public function defaultAttrbutes() {
        // array('attributeName'=>'attributeValue')
        return array();
    }
}
?>
Ответить