2011-02-15 57 views
3

我遇到意想不到的行为与表单处理,symfony 1.4与教条。我有有许多一对多的关系,本身就是一个表:奇怪的symfony 1.4形式多对多的行为与学说

Person: 
    [...] 
    relations: 
    Teachers: 
     class: Person 
     refClass: PersonTeacher 
     local: student_id 
     foreign: teacher_id 
     foreignAlias: Students 

PersonTeacher: 
    columns: 
    teacher_id: { type: integer, primary: true } 
    student_id: { type: integer, primary: true } 

在的人,我有这被称为为personForm用于自定义窗口小部件的方法:没有

public function getTeachersOrderByName() 
{ 
    $q = Doctrine::getTable('Person') 
    ->createQuery('t') 
    ->leftJoin('t.Students s') 
    ->where('s.id = ?', $this->getId()) 
    ->orderBy('t.last_name, t.first_name ASC'); 

    return $q->execute(); 
} 

该方法调用,Doctrine从PersonTeacher正确插入和删除记录。

Doctrine_Connection->update(object('PersonTeacherTable'), array('student_id' => '9'), array('teacher_id' => '9', 'student_id' => '6')) 

会抛出

SQLSTATE[23000]: Integrity constraint violation: 19 columns teacher_id, student_id are not unique 

回溯::但是,当我调用该方法从为personForm,下面的更新是在保存形式为[从日志取]运行

at Doctrine_Connection_Statement->execute(array('9', '9', '6')) 
in SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php line 1042 ... 
at Doctrine_Connection->exec('UPDATE person_teacher SET student_id = ? WHERE teacher_id = ? AND student_id = ?', array('9', '9', '6')) 
in SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php line 653 ... 
at Doctrine_Connection->update(object('PersonTeacherTable'), array('student_id' => '9'), array('teacher_id' => '9', 'student_id' => '6')) 
in SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/UnitOfWork.php line 534 ... 
at Doctrine_Connection_UnitOfWork->update(object('PersonTeacher')) 
in SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/UnitOfWork.php line 89 ... 
at Doctrine_Connection_UnitOfWork->saveGraph(object('PersonTeacher')) 
in SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php line 1718 ... 
at Doctrine_Record->save(object('Doctrine_Connection_Sqlite')) 
in SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Collection.php line 910 ... 
at Doctrine_Collection->save(object('Doctrine_Connection_Sqlite'), 1) 
in SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/UnitOfWork.php line 136 ... 
at Doctrine_Connection_UnitOfWork->saveGraph(object('Person')) 
in SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php line 1718 ... 
at Doctrine_Record->save(object('Doctrine_Connection_Sqlite')) 
in SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Collection.php line 910 ... 
at Doctrine_Collection->save(object('Doctrine_Connection_Sqlite'),) 
in SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/UnitOfWork.php line 445 ... 
at Doctrine_Connection_UnitOfWork->saveAssociations(object('Person')) 
in SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/UnitOfWork.php line 142 ...145. 
at Doctrine_Connection_UnitOfWork->saveGraph(object('Person')) 
in SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php line 1718 ... 
at Doctrine_Record->save(object('Doctrine_Connection_Sqlite')) 
in SF_SYMFONY_LIB_DIR/form/addon/sfFormObject.class.php line 161 ... 
at sfFormObject->doSave(object('Doctrine_Connection_Sqlite')) 
in SF_ROOT_DIR/lib/form/doctrine/base/BasePersonForm.class.php line 116 ... 
at BasePersonForm->doSave(object('Doctrine_Connection_Sqlite')) 
in SF_SYMFONY_LIB_DIR/form/addon/sfFormObject.class.php line 130 ... 

只有当多对多表指向同一个表时才会发生这种情况。我也有一对一指向它自己的表,并且它能正常工作。

这枚戒指任何钟声?

+0

是否失败的约束似乎正确的你?我同意这对(teacher_id,student_id)在refClass表中应该是唯一的,但是teacher_id本身不应该是唯一的,student_id也不应该是唯一的。你能否检查一下你的餐桌结构,告诉我们它受到了什么限制? – greg0ire 2011-02-15 22:25:53

+0

@ greg0ire:在我的SQLite数据库中创建的唯一约束是PK(在symfony生成的schema.sql中确认),所以我认为错误是指PK。问题是根本不应该调用Doctrine_Connection :: update() - PersonTeacher记录只应根据需要进行INSERT和DELETEd,直到我尝试调用getTeachersOrderByName()方法时才会发生这种情况。这不知何故打开了神秘的更新()调用的大门。 – yitznewton 2011-02-15 22:36:29

回答