cakephp 3.0 - 保存独特的关联

Posted

技术标签:

【中文标题】cakephp 3.0 - 保存独特的关联【英文标题】:cakephp 3.0 - Saving unique asscociations 【发布时间】:2015-09-09 11:19:10 【问题描述】:

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

有适合​​我的蛋糕魔法吗?

提前致谢,

菲尔

【问题讨论】:

保存具有(唯一)关联已存在的实体的最佳做法是什么?什么实体?有哪些独特的联想?请澄清您的问题(例如,显示您拥有并尝试保存的示例数据。)如何获取现有(例如 country.id)的 id(外键)以将其链接到地址表? 这似乎是相关模型上 find 方法的基本/初步使用。再次,使用示例数据作为您尝试解决的问题的示例将帮助其他人提供更详细的答案。 在创建地址时,您肯定不会创建国家/地区 - 您将使用选择(或类似的)并仅指定 address.country_id。您提出问题的方式很奇怪 - 但问题中没有代码。 【参考方案1】:

我认为你应该首先在纸上开发一个逻辑关系模型,并在你开始使用像 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 可以在 multiple cities 中使用,city 可以有 multiple streets。这听起来像是多对多连接。 但也请记住,街道名称可能会被更改(新的拼写法,在特殊事件或其他特殊当地情况后重命名)。这不会经常发生,但它可能会发生。因此,如果您在多对多关系中更新街道名称,则所有链接城市的街道名称都会更改。在这一点上,您所谈论的地址类型可能与您有关,您可能需要考虑如何管理此类更改。

示例 3:街道编号

我个人不会为街道号码使用单独的表格,因为它们通常很短,也可能是“特殊的”,例如“5”、“632 b”、“36826 3rd floor”等等。 (我不太确定,但我认为如果您将街道号码与地址直接保存,则根据请求时间或数据库大小没有太大差异,因为外键可能具有相似的长度)

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

CakePHP 中没有现成的“魔法”来处理这个问题。首先你应该修复你的表关系,而不是你可以使用 CakePHP 提供的一些工具(行为),但是对于这种记录,你也必须编写自己的逻辑。

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

查找相关表的列表,设置它们到视图模板中,并在 form helper 中使用它们来创建选择列表(例如下拉菜单)

在 add/edit-address-view 中添加链接以创建新的城市/zips/whatever

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

这个答案很长,但只有一些提示。请注意,您的问题过于宽泛,无法在此处详细回答。对于下一个问题,请更具体的编码相关问题,添加代码示例并在How to ask查看提示,谢谢。

【讨论】:

以上是关于cakephp 3.0 - 保存独特的关联的主要内容,如果未能解决你的问题,请参考以下文章

Cake php 4 使用数组中的关联保存数据

CakePHP 3.0 保存我的关联数据

CakePHP- 保存相关模型数据

cakePHP - 有条件的保存,可以吗?

如何在 Cake PHP 3.5 中设置模型之间的关联?

CakePHP 3.0 连接数据库失败