@EVOSandru6

Как в Yii правильно пользоваться beforeSave?

Ситуация такова, у меня 2 таблицы:

-----------
t_service |
-----------
CODE |
NAME |
PRICE |
------------

и

--------------
mc_price |
--------------
CODE |
NAME |
--------------

Связь через Foreign Key : t_servce.PRICE = mc_price.CODE

В beforeSave славно отрабатывает if($this->isNewRecord), но else выкидывает ошибку:

CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`visakaz`.`t_service`, CONSTRAINT `fk_t_service_mc_price1` FOREIGN KEY (`PRICE`) REFERENCES `mc_price` (`CODE`) ON DELETE NO ACTION ON UPDATE NO ACTION). The SQL statement executed was: UPDATE `t_service` SET `CODE`=:yp0, `CODE_PAR`=:yp1, `LEVEL`=:yp2, `SHIFR`=:yp3, `NAME`=:yp4, `NAME_EN`=:yp5, `NAME_KZ`=:yp6, `NAME_DE`=:yp7, `NAME_CH`=:yp8, `NAME_TU`=:yp9, `NAME_AR`=:yp10, `DESCRIPTION`=:yp11, `DESCRIPTION_EN`=:yp12, `DESCRIPTION_KZ`=:yp13, `DESCRIPTION_DE`=:yp14, `DESCRIPTION_CH`=:yp15, `DESCRIPTION_TU`=:yp16, `DESCRIPTION_AR`=:yp17, `PHOTO`=:yp18, `PRICE`=:yp19 WHERE `t_service`.`CODE`=1

Так же exception ссылается на сохранение в контроллере:

class ServiceController extends CController{
...
if($model->save())
...
}


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

<div class="row">
        <?php echo $form->labelEx($model,'PRICE_CODE'); ?>
        <?php echo $form->textField($model,'PRICE_CODE', array('type'=>'hidden', 'value'=>$model->PRICE)); ?>
        <?php echo $form->error($model,'PRICE_CODE'); ?>
    </div>

<div class="row">
	<?php echo $form->labelEx($model,'PRICE'); ?>
	<?php echo $form->textField($model,'PRICE', array('value'=>$model->price->NAME)); ?>
	<?php echo $form->error($model,'PRICE'); ?>
</div>


Для этого пришлось создать свойство PRICE_CODE в модели Service.

Я так понимаю, что ошибка из за того, что у меня имеется связь между таблицами и в момент обновления таблице t_service пытаются подсунуть вместо кода цены фактическую цену. Это абсурд.

Мои соображения:

1.Нужно либо запретить при обновлении обновлять t_service.PRICE
2. Попробовать обновлять в beforeSave t_service.PRICE на значение из скрытого поля, т.е. ничего не изменится и связь будет правильная.

Как можно реализовать такие варианты? И Еще, можно ли как то обойтись без скрытого поля в форме $PRICE_CODE или же можно вообще обойтись без упоминания данного свойства в классе с помощью какого нибудь события, происходящего после того как нажата кнопка обновить и до того, как $this->PRICE будучи кодом ссылкой на поле в таблице mc_price становиться к примеру 500.50?

И еще вдогонку в методе beforeSave() когда обновление происходит в Модели Service, у меня такой код

$price = Price::model()->findByPk($this->PRICE_CODE);
$price->NAME = $this->PRICE;
$price->save();


Глаза режет лишний запрос, можно ли это как то через связь сохранить данные, типа

// Типа через связь присвоили
$this->price->NAME = $this->PRICE;
// это строка заведомо неправильная, просто интересно, возможно ли сохранения таким образом проводить.
$price->save();


???
  • Вопрос задан
  • 2655 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы