cakephp 3.0 -保存唯一的关联


cakephp 3.0 - Saving unique asscociations

在我看来,使用ORM的原因之一是防止表中重复记录。为了达到这个目的,可以创建外键将多个表连接在一起。

我的问题如下:

表"地址":

+---------------+---------+------+-----+---------+----------------+
| Field         | Type    | Null | Key | Default | Extra          |
+---------------+---------+------+-----+---------+----------------+
| id            | int(11) | NO   | PRI | NULL    | auto_increment |
| country_id    | int(11) | NO   |     | NULL    |                |
| city_id       | int(11) | NO   |     | NULL    |                |
| street_id     | int(11) | NO   |     | NULL    |                |
| zip_id        | int(11) | NO   |     | NULL    |                |
| street_number | int(11) | NO   |     | NULL    |                |
+---------------+---------+------+-----+---------+----------------+
表"国家":

+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(45) | NO   | UNI | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

(与其他表逻辑相同)

当我试图保存一个已经存在的国家名称的条目时,我会得到一个mysql唯一的错误。这很清楚,完全没问题。

问题是:保存具有(唯一)关联的实体的最佳实践是什么?以及如何获得现有(例如country.id)的id(外键)以将其链接到地址表中?

有没有适合我的蛋糕魔法?

提前感谢,

菲尔

我认为你应该首先在纸上开发一个逻辑关系模型,并在你深入实践像CakePHP这样的框架之前更多地考虑可能的数据组合和关系。

在多个表中分离数据以避免双条目是可以的-但只有在有意义的情况下。不幸的是,它对地址示例中的所有字段都没有意义,并且您的关系似乎也不符合逻辑。

如果不知道你打算做什么或者你谈论的是什么类型的数据(地址),很难向你推荐一些东西。它是一个只有几到100个条目的私人地址簿,还是一个包含整个国家甚至多个国家的数千或数百万个地址的大型应用程序…

示例1:城市和邮政编码
  • 一个city可能有多个 zip codes(在某些国家),一个zip code 可能属于一个city(至少在一个国家内)。

  • 一个address 有一个 zip code,一个zip code可以链接到多个 addresses

  • 由于有了这种关系,您不需要将addresses表连接到cities表,因为您可以通过zip code获得city名称。您的连接线是:Address 有一个 zip code属于一个 city

示例2:街道名称

  • street name可用于多个 cities, city可用于多个 streets。这听起来像是一个多对多连接。
  • 但也要记住,街道名称可能会改变(新的正字法,在特殊事件或其他特殊的当地情况后重新命名)。这种情况不会经常发生,但可能会发生。因此,如果您在多对多关系中更新街道名称,那么所有关联城市的街道名称都会更改。在这一点上,你所谈论的地址类型可能是相关的,你可能需要考虑如何管理这种变化。
示例3:街道号码
  • 我个人不会使用单独的街道号码表,因为它们通常很短,也可能是"特殊的",例如。"5", " 632b ", "36826 3楼"等等。
  • (我对此不太确定,但我认为如果您直接将街道号码与地址保存,则根据请求时间或数据库大小不会有太大差异,因为外键可能具有类似的长度)

现在回到你最后的主要问题:

在CakePHP中没有现成的"魔法"来处理这个问题。首先,你应该修复你的表关系,然后你可以使用CakePHP提供的一些工具(行为),但对于这种类型的记录,你将不得不编写自己的逻辑。

如果您添加了一个新地址,您需要

  • 查找相关表的列表,设置它们到视图模板中,并与表单帮助器一起使用它们来创建选择列表(例如下拉列表)

  • 在add/edit-address-view中添加链接来创建新的城市/zip/等等

对于用户友好的输入表单,您可能需要使用一些javascript/Ajax,以及根据其他选定值更改选择下拉菜单中的选项,例如仅显示预先选定的城市可用的邮政编码或添加新的街道名称…

这个答案读起来很长,但只有一些提示。请注意,你的问题太宽泛了,无法在这里详细回答。对于下一个问题,请更具体地与编码相关的问题,添加代码示例,并查看如何提问的技巧,谢谢。