2013-05-01 54 views
0

我正在使用Propel 1.4.2在Symfony 1.4項目中工作。symfony 1.4和propel - 外部約束失敗保存關係

我有2個相關的表格。講習班和培訓師,這是一個由包含workshop_id和trainer_id的連接表(workshop_trainers)映射的多對多關係。

在我的工作室表格中,我有一個選擇框用於將培訓人員添加到工作間。問題是,當車間是新的(創建)我得到一個錯誤:

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

這是因爲,節省了workshop_trainers關係時workshop_id字段爲空。是不是足夠聰明地知道表格之間存在關係並首先保存基礎對象?我做錯了什麼?

我的教練列表小部件。

$這 - > 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 2013-05-02 08:24:11

回答

0

這不是解決問題,但是這是對這個問題最簡單實用的解決方案:

在形式,只要停用workshop_trainer_list場如果對象是一個新的(沒有一個ID還)。

喜歡的東西:

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

更好的解決方案是更新DoSave就會方法先有ID,這樣的事情:

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); 
    }