2013-05-01 2 views
0

Я работаю над проектом Symfony 1.4 с Propel 1.4.2.symfony 1.4 и propel - внешние ограничения не удалось сохранить отношение

У меня есть 2 связанных таблицы. мастерской и тренерами, которая представляет собой много-много отношений, сопоставленных таблицей соединений (workshop_trainers), которая содержит workshop_id и trainer_id).

В моей форме семинара у меня есть поле для добавления тренеров в мастерскую. Проблема заключается в том, когда семинар новый (Create) Я получаю сообщение об ошибке:

Cannot add or update a child row: a foreign key constraint fails 

Это происходит потому, что при сохранении соотношения workshop_trainers workshop_id поле равно нулю. Isn't Propel достаточно умный, чтобы знать, что существует связь между таблицами и сначала сохранить базовый объект? Что я делаю неправильно?

Мой виджет списка инструкторов.

$ this-> widgetSchema [ 'workshop_trainer_list'] = новый sfWidgetFormChoice (массив ( 'выбор' => $ тренеры, 'мультипликатор' => верно, ));

Благодарим за помощь.

+0

Не уверен, если это полезно, но Я помню, что есть некоторые проблемы с Propel и отношениями «многие ко многим». Прочтите этот пост (особенно пункт 3) http://itsmajax.com/2011/01/29/6-things-to-know-about-embedded-forms-in-symfony/. Это ошибка, с которой он пытается работать http://trac.symfony-project.org/ticket/5867. Сообщение стоит прочитать в любом случае ... – antony

ответ

0

Это не фиксируя проблему, но это самое простое практическое решение этой проблемы:

В форме, просто отключить workshop_trainer_list поле, если объект является новым (не имеет идентификатора еще).

Что-то вроде:

if ($this->getObject()->isNew()) 
{ 
    $this->offsetUnset('workshop_trainer_list'); // not sure of that method name 
} 

Лучшее решение для обновления метод doSave иметь идентификатор первого, что-то вроде этого:

protected function doSave($con = null) 
{ 
    $isNew = $this->getObject()->isNew(); 
    if (null === $con) 
    { 
     $con = $this->getConnection(); 
    } 

    // retrieve the value of workshop_trainer_list here and remove it from the form 
    $trainers = ... 
    $this->offsetUnset('workshop_trainer_list'); 

    // save without it 
    parent::doSave($con); 

    // add it back 
    $this->getObject()->set... 

    // save 
    $this->getObject()->save($con); 
    } 
Смежные вопросы