在管理表单中与一对多关系苦苦挣扎

时间:2011-04-22 11:10:08

标签: php symfony1 propel

如果我的问题的答案非常明显,我会道歉。我是Symfony的新手,我无法在SO处找到与我的问题完全相同的问题,因此我发布了一个问题。 (谷歌也没有多少帮助,但是我再次对Symfony的术语不是很熟悉,所以我可能会严厉地说出我的疑问。)

所以,直截了当。 schema.yml

user:
  id:
  email:   { type: varchar, size: 255, required: true }
  ... # etc.

partner:
  user_id: { type: integer, foreignTable: user, foreignReference: id }

(顺便说一下,使用Symfony 1.3和Propel 1.4)。

所以我生成了 $ user-> getPartners() $ partner-> getUserId()方法(即使我读过某个地方,如果你的FK是参考表中的PK,Propel强制一对一的关系,但我观察一对多,除非我弄错了)。精细。但是,我有一个管理模块来编辑用户,目前我很难理解我是如何使Symfony在“用户/编辑”表单中显示多个合作伙伴列表(双列表会很好)太)。

尝试将“合作伙伴”和“partner_list”放在 apps / backend / modules / user / generator.yml 中(我成功添加了布尔值和静态选择[via *已经Peer :: getXXXChoices()]字段,只是为了得到错误“Widget'合作伙伴'不存在”。

我可以编辑表单类,但我不知道如何使用“multiple = true”告诉Propel形成一对多的视觉关系,因为“选择”不是静态的;这取决于另一张桌子。

那我该怎么做?如果我省略了一些重要的事情,请随时询问其他详细信息。

问候。

1 个答案:

答案 0 :(得分:1)

我曾经遇到过同样的问题所以这是我解决问题的方法。 Symfony在这种情况下不是很聪明,所以你需要帮助它。您描述的模型是对问题的良好关系模型解释:

user:
  id:
  email:   { type: varchar, size: 255, required: true }
  ... # etc.

partner:
  user_id: { type: integer, foreignTable: user, foreignReference: id }

事实上,Symfony真正简化了它,当Propel生成表单和生成器解析子表单以保存数据时,它会解释user_id字段,就好像它是任何正常字段(不是以一对多的方式)。

因此,如果您真的希望为您生成由symfony创建的多选项及其背后的所有逻辑,则需要在这两个类之间创建多对多的关系。架构最终应该是这样的:

user:
  id:
  email:   { type: varchar, size: 255, required: true }
  ... # etc.

partner:
  user_id: { type: integer, foreignTable: user, foreignReference: id }

user_partner:
  user_id: { type: integer , foreignTable: user, foreignReference: id, primaryKey: true}
  partner_id: { type: integer , foreignTable: partner, foreignReference: id, primaryKey: true}

这样,您将在用户表单中拥有partner_list小部件,并在合作伙伴表单中拥有user_list小部件。我总是取消我不需要的那个,真的像魅力一样。

其他解决方案,最适合您的模型实现的解决方案有点复杂,因为您需要修改UserForm并添加partner_ids多选小部件,然后修改doSave方法以便能够处理多选节省逻辑(创建实例,将它们与用户关联并保存它们,也删除未选择的实例)。

相关问题