我正在使用Propel作为ORM的Symfony 1.2(无法更新,这不取决于我)。我与多对多的关系有一个奇怪的问题。
假设您有两个表A
和B
,以及多对多关系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,我可以更新a
和b
而不会失去(a_id, b_id)
关系。
所有表都是MySQL / InnoDB。 A_id
中的列B_id
和A_has_B
是指向A
和B
id的外键。我在两个列中都有ON DELETE CASCADE
和ON UPDATE CASCADE
。
非常感谢你的帮助。
更新:以下是三个表Team
和Participants
的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
关系。
答案 0 :(得分:0)
好的,我意识到问题所在。当然,有点傻。
在我的关系中,请说A_has_B
我隐藏了a_has_b_list
generator.yml中的B
字段,只允许从A
表格进行修改。但这是一个错误,因为只是隐藏generator.yml中的字段并没有取消它,只是隐藏它并且它以空值发布(因此它会覆盖数据库)。有必要以B
形式configure()
方法取消设置窗口小部件:
unset($this->widgetSchema['a_has_b_list'];
这样,就不会发布任何内容,也不会覆盖数据库。