Ситуация такова, у меня 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();
???