2011-09-09 44 views
1

我有了这样一个场景,还有很多以两个表之间一对多的关系(与他们之间的第三个“联想”表)的数据库:Zend框架单页的形式与许多处理很多关系

如:

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   [email protected] 

_________V  _______________ [Add Contact Button] 

... plus more fields for the user table ... 

所以在我上面的示例中,我有用户名字段(将放在用户表中),一个与用户相关的所有联系人信息记录表(在用户名字段中),这些记录将进入contact_info表,然后是contact_type和contact_details的表单元素(在表格下方各自的列下方)(带有添加按钮?),这会将联系人信息添加到联系人的“表格”中。然后在下面的所有部分,更多属于用户表的字段。

如果您追踪我到目前为止,我面临的问题是客户希望这显示在单个窗体而不是多个页面或以两种形式分开,流程必须“看起来”像一个单一的窗体(即使这些元素将属于不同的数据库表

其次,将数据放入contact_info表中已经足够简单了,但是直到剩下的'user'字段被填写并且没有实际的user_id被生成用户记录被更新,因此,我无法看到如何在user_has_contact_info中添加关联记录,而不先保存用户记录并将联系人信息添加到第二个。

Fina lly,首选是避免javascript(尽管没有完全排除,因为几乎任何解决方案都要求JavaScript或者页面刷新部分表单字段数据保留,甚至可能验证和过滤器问题 - 还没有得到远远)

所以我最终的问题是什么是在上面的场景中使用Zend_Form处理多对多数据库表关系的最佳方法。我可能会解决这个问题,并错过这里的简单解决方案,并期待不同的观点。

请注意,这不是关于如何设计数据库的问题,而是如何创建zend表单来处理数据库的方式。

+0

只是检查:你是否需要模式中的多对多?似乎联系人可能会分配给单个用户,尽管单个用户可能有多个联系人,因此您可能只需要一对多的联系人。无需关联表,使其更容易一些。 –

+0

@DavidWeinraub是的,我想再次看看我的上面的例子,这不是一个很好的多对多的例子。在我现实生活中的数据库表结构中,我正在处理几个多对多的表关系,这些表关系对许多必需的字段来说都是很多的。我试图提供一个简单的例子来说明我的观点。不过,我同意,我的例子有点失败! :)是去概念,不一定确切的细节。 –

回答

1

似乎有在这里两个问题:

  1. 插入到用户表,进入接触表格和用户接触的表。

  2. 处理动态 - 即客户端确定 - 每个用户的联系记录数。

对于第二部分,看到处理与Zend_Form领域的客户端确定的数量杰里米·肯德尔的excellent article。结束语是客户端JavaScript跟踪在调用isValid()getValue()之前,读取此信息并修改表单对象的preValidation()方法配对的新字段数。

在第一部分,好像你基本上是有它的权利:

  1. 创建用户记录并获得用户ID。

  2. 对于表单中的每个接触块,创建联系人记录并获取联系人ID;并创建两个ID的卡在相关联的用户联系人记录

可能希望在交易来包装一些不起来,所以如果一个部分出现故障 - 比如,用户触点插入失败 - 您不会收到与任何用户不相关的孤立联系人记录。

+0

我不得不说,我对你的知识总是印象深刻,对这里的回应延迟感到抱歉,因为我们的办公室一直在过去的一周移动到一个新的位置,但让我明天早上重新阅读(包括这篇文章),并且会让你知道我是否有任何问题(并且会接受它) –

+0

@AaronMurray:没有延迟的汗水;现实生活总是首先。并感谢您的赞美。 ;-) –

+0

它似乎真正处理这种情况的唯一方法是客户端(JavaScript)和处理它的服务器端,但该文章是非常有用的服务器端处理,希望能够避免JavaScript,它似乎是通过客户端处理而不是保留所有服务器端的更简单的途径。再次感谢!我期待着我的下一个问题和你的下一个解决方案,我的问题:)和平! –

相关问题