简体   繁体   English

使用Doctrine在symfony 1.4表单中出现奇怪的多对多行为

[英]Odd many-to-many behavior in symfony 1.4 forms with Doctrine

I am encountering unexpected behavior with form processing, symfony 1.4 with Doctrine. 我遇到了表单处理的意外行为,symfony 1.4与Doctrine。 I have a table which has a many-to-many relationship to itself: 我有一个与自身有多对多关系的表:

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 }

In Person, I have a method which gets called in PersonForm for use in a custom widget: 在Person中,我有一个在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();
}

Without that method call, Doctrine correctly INSERTs and DELETEs records from PersonTeacher. 如果没有该方法调用,Doctrine会正确地从PersonTeacher中插入和删除记录。 But when I call that method from the PersonForm, the following UPDATE is run upon saving the form [taken from the logs]: 但是当我从PersonForm调用该方法时,在保存表单[从日志中获取]时运行以下UPDATE:

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

which throws 哪个扔了

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

Backtrace: 回溯:

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 ...

This only occurs when the many-to-many refers to the same table. 仅当多对多引用同一个表时才会发生这种情况。 I also have a one-to-many referring to its own table, and it works correctly. 我也有一对多引用自己的表,它可以正常工作。

This ring any bells? 这戒指任何铃声?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM