我有一个数据库,其中有两个表之间存在多对多的关系(在它们之间有第三个'associative'表):
例如:
Table 1 : user (primary key id)
Table 2 : contact_info (primary key id)
Associative table: user_has_contact_info (primary key id, foreign keys: user_id and contact_info_id)
现在,应用程序的要求是能够在创建用户记录的同一页面上添加多个“contact_info”条目:
例如:(表格)
UserName: ___________
Contact Type Contact Detail
Phone 123-4567
Email me@here.com
_________V _______________ [Add Contact Button]
... plus more fields for the user table ...
因此,在上面的示例中,我有用户名字段(将在用户表中),一个表格,其中包含与用户相关的所有联系信息记录(在用户名字段中),这些记录将进入contact_info表,然后是contact_type和contact_details的表单元素(在表格下面各自的列下)(带有一个添加按钮?),它会将联系人信息添加到联系人“表格”。然后,所有这些,属于用户表的更多字段。
如果你到目前为止跟踪我,我面临的问题是客户希望这个在单个表单上显示而不是多页或以两种形式分开,流程必须“看起来”像一个表单(即使元素将属于不同的数据库表。
其次,将数据放入contact_info表很简单,但是在填写“用户”字段的其余部分并更新用户记录之前,没有生成实际的user_id,因此,我是没有看到如何在user_has_contact_info中添加关联记录,而没有先保存用户记录并再次添加联系信息。
最后,首选是避免javascript(虽然不完全排除,因为几乎任何解决方案都需要javascript - 或 - 页面刷新与部分表单字段数据保留,甚至可能甚至验证和过滤器问题 - 有还没到那么远)
所以我的最终问题是,在上面的场景中使用Zend_Form处理多对多数据库表关系的最佳方法是什么。我可能会过度思考这个问题而忽略了这里的简单解决方案,并期待不同的观点。
请注意,这不是关于如何设计数据库的问题,而是如何创建zend表单来按照设计的方式处理数据库。
答案 0 :(得分:1)
这里似乎有两个问题:
插入用户表,联系人表和用户联系表。
处理动态 - 即客户端确定 - 每个用户的联系人记录数。
对于第二部分,请参阅Jeremy Kendall excellent article关于使用Zend_Form
处理客户端确定数量的字段的问题。结果是客户端javascript跟踪在表单上与preValidation()
方法配对的新字段数量,该方法会在您调用isValid()
和getValue()
之前读取此信息并修改表单对象
对于第一部分,看起来你基本上是正确的。:
创建用户记录并获取用户ID。
对于表单中的每个联系人块,创建联系人记录并获取联系人ID;并使用两个id卡住来创建关联的用户联系人记录。
可能希望在事务中包含其中的一部分,以便如果一个部分失败 - 例如,用户联系人插入失败 - 您最终没有与任何用户无关的孤立联系人记录。