cakephp 3.0-保存唯一关联

cakephp 3.0-保存唯一关联,php,mysql,cakephp,orm,associations,Php,Mysql,Cakephp,Orm,Associations,在我看来,使用ORM的原因之一是防止表中出现重复记录。要实现这一点,可以创建外键将多个表链接在一起 我的问题如下: 表“地址”: +---------------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+---------+------+-----+---------

在我看来,使用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(外键)以将其链接到addresses表中

有适合我的蛋糕魔术吗

提前感谢,


Phil

我认为,在使用CakePHP这样的框架进行实践之前,您应该首先在纸上手工开发一个逻辑关系模型,并进一步考虑可能的数据组合和关系

在多个表中分离数据以避免重复条目是可以的,但前提是这样做有意义。不幸的是,它对地址示例中的所有字段都没有意义,而且您的关系似乎也不符合逻辑

此外,在不知道您计划做什么或正在谈论什么类型的数据(地址)的情况下,很难向您推荐一些东西。它是一个只有几到100个条目的私人通讯簿,还是一个拥有数千或数百万个地址的大型应用程序,来自一个国家甚至多个国家

示例1:城市和邮政编码

  • 一个
    城市
    可能有多个
    邮政编码
    (在某些国家/地区),而一个
    邮政编码
    属于一个城市(至少在一个国家/地区内)

  • 一个
    地址
    有一个
    邮政编码
    ,一个
    邮政编码
    可以链接到多个
    地址

  • 由于存在这种关系,您不需要将
    地址
    表连接到
    城市
    表,因为您可以通过
    邮政编码
    获得
    城市
    名称。您的连接线路是:
    地址
    有一个
    邮政编码
    属于一个
    城市

例2:街道名称

  • 街道名称
    可用于多个
    城市
    城市
    可具有多个
    街道
    。这听起来像是一种多对多的连接
  • 但也要记住,街道名称可能会被更改(新的拼写法,在特殊事件后或由于其他特殊的当地情况而重命名)。这种情况不会经常发生,但可能会发生。因此,如果在多对多关系中更新街道名称,则所有链接城市的街道名称都将更改。这一点可能与您所谈论的地址类型有关,您可能需要考虑如何管理此类更改
例3:街道号码

  • 我个人不会使用单独的街道号码表,因为街道号码通常很短,也可以是“特殊”的,例如“5”、“632 b”、“36826三楼”或其他
  • (我对此不太确定,但我认为如果直接将街道号码与地址一起保存,则根据请求时间或数据库大小不会有太大差异,因为外键可能具有类似的长度)
现在谈谈你最后的主要问题:

CakePHP中没有现成的“魔法”来处理这个问题。首先,您应该修复表关系,然后才能使用CakePHP提供的一些工具(行为),但对于此类记录,您还必须编写自己的逻辑代码

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

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

  • 在“添加/编辑地址”视图中添加链接,以创建新城市/拉链/任何内容

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


这个答案很长,但只有一些提示。请注意,您的问题太广泛,无法在此详细回答。对于下一个问题,请更具体地说明与编码相关的问题,添加代码示例,并查看上的提示,谢谢。

保存具有(唯一)关联的实体的最佳做法是什么?什么实体?什么独特的联想?请澄清您的问题(例如,显示您拥有并试图保存的样本数据)。如何获取现有的id(外键)(例如country.id)以将其链接到addresses表中?这似乎是find方法在相关模型上的基本用法。同样,使用示例数据作为您试图解决的问题的示例将有助于其他人提供更详细的答案。创建地址时,您肯定不会创建国家/地区-您将使用select(或类似)并仅指定address.country\u id。你对这个问题的措辞很奇怪,但问题中没有代码。