Есть задача:
Если модель не найдена, то создать ее, дать ей дефолтные значения, сохранить и вернуть. подскажите как правильно это реализовать
AfterFind если модель не найдена
- timlar
- Сообщения: 1382
- Зарегистрирован: 2009.09.19, 17:49
- Откуда: Украина, Днепропетровск
- Контактная информация:
Re: AfterFind если модель не найдена
А что значит "модель не найдена"? Может покажешь кусок кода?
Twitter: @timlar_ua
-
- Сообщения: 350
- Зарегистрирован: 2009.09.17, 16:47
- Откуда: Санкт-Петербург
- Контактная информация:
Re: AfterFind если модель не найдена
Какая-то абстрактная задача, но есть к примеру такая штука CDefaultValidator.
Предупрежден - значит вооружен.
devKP.ru
devKP.ru
Re: AfterFind если модель не найдена
если модель не найдена, то и нет afterFind(), в методе find() написано, чтоyupiee писал(а):Есть задача:
Если модель не найдена, то создать ее, дать ей дефолтные значения, сохранить и вернуть. подскажите как правильно это реализовать
а у Null нет такого методаreturn CActiveRecord the record found. Null if no record is found
А дефолтные значения будут присвоены ( если они для таблицы указаны ) при
Код: Выделить всё
$obj = new Model;
Код: Выделить всё
/*
// если вдруг что-то другое нужно, чтоб валидацию пройти
$obj->attributes=$arrayDefaults;
*/
$obj->save();
Re: AfterFind если модель не найдена
В контроллере:
Соответственно в модели создаём метод setDefault()
Писал "на коленке", но думаю идея ясна. Сценарии нужны, чтобы применять нужные правила при задании значений по-умолчанию.
Код: Выделить всё
public function actionGetModel($id)
{
$model = MyModel::model()->findByPk($id);
if (!isset($model)) {
$model = new MyModel('default');
$model->setDefault();
$model->save();
$model->setScenario('update');
}
// Делаем что нужно с моделью...
}
Код: Выделить всё
public function setDefault()
{
if ($this->getScenario() != 'default')
return;
$this->attributes = array(
'id'=>1,
'name'=>'blahblah'
// и т.д.
);
}
Конференция: yii@conference.jabber.ru
Re: AfterFind если модель не найдена
Добавить в модель метод Model::findOrCreate дальше думаю все понятно
Re: AfterFind если модель не найдена
Думаю, что если эта задача повторима для нескольких моделей. То уже лучше сделай свой 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();
}
}
?>