在symfony中更新外部实体时会丢弃多对多关系

时间:2011-12-30 10:01:30

标签: php mysql symfony1 many-to-many propel

我正在使用Propel作为ORM的Symfony 1.2(无法更新,这不取决于我)。我与多对多的关系有一个奇怪的问题。

假设您有两个表AB,以及多对多关系A_has_B。假设a中有一个A实体,b中有一个B实体,A_has_B中有一个PK为(a_id, b_id)的关系。现在,如果我使用symfony admin生成的模块更新b实体(不是其id,而是另一个不是其PK的字段),则会从数据库中删除(a_id, b_id)

这只发生在使用Symfony后端。它不会发生在使用phpmyadmin,我可以更新ab而不会失去(a_id, b_id)关系。

所有表都是MySQL / InnoDB。 A_id中的列B_idA_has_B是指向AB id的外键。我在两个列中都有ON DELETE CASCADEON UPDATE CASCADE

非常感谢你的帮助。

更新:以下是三个表TeamParticipants的yml架构及其关系

propel:
  _attributes:
    package: lib.model
    defaultIdMethod: native
  team:
    _attributes: { phpName: Team }
    id: { type: INTEGER, size: '11', primaryKey: true, autoIncrement: true, required: true }
    name: { type: VARCHAR, size: '255', required: true }
    description: { type: LONGVARCHAR, required: false }
  participant:
    _attributes: { phpName: Participant }
    id: { type: INTEGER, size: '11', primaryKey: true, autoIncrement: true, required: true }
    name: { type: VARCHAR, size: '255', required: true }
  team_has_participant:
    _attributes: { phpName: TeamHasParticipant }
    team_id: { type: INTEGER, size: '11', primaryKey: true, required: true, foreignTable: team, foreignReference: id, onDelete: CASCADE, onUpdate: CASCADE }
    participant_id: { type: INTEGER, size: '11', primaryKey: true, required: true, foreignTable: participant, foreignReference: id, onDelete: CASCADE, onUpdate: CASCADE }
    _indexes: { participant_id: [participant_id] }

假设我更新description实体中的team字段,然后我将丢失所有具有该外国team_has_participant实体的team关系。

1 个答案:

答案 0 :(得分:0)

好的,我意识到问题所在。当然,有点傻。

在我的关系中,请说A_has_B我隐藏了a_has_b_list generator.yml中的B字段,只允许从A表格进行修改。但这是一个错误,因为只是隐藏generator.yml中的字段并没有取消它,只是隐藏它并且它以空值发布(因此它会覆盖数据库)。有必要以B形式configure()方法取消设置窗口小部件:

unset($this->widgetSchema['a_has_b_list'];

这样,就不会发布任何内容,也不会覆盖数据库。