【发布时间】:2013-01-21 18:30:43
【问题描述】:
我的情况: 我有一个基于链接在一起的几个模型的表格。 在后台,我有一个保存图像的例程,基于对特定控制器的 ajax 调用,该控制器上传图像并将其实时显示在文本区域上。 当我必须第一次保存记录时,我的问题适用,因为 ajax 例程需要知道记录的 ID 才能关联图像,但这只有在调用 save() 之后才会创建。 有没有办法在模型保存之前获取 ID?或其他一些解决方法
提前感谢大家
鲁迪
【问题讨论】:
我的情况: 我有一个基于链接在一起的几个模型的表格。 在后台,我有一个保存图像的例程,基于对特定控制器的 ajax 调用,该控制器上传图像并将其实时显示在文本区域上。 当我必须第一次保存记录时,我的问题适用,因为 ajax 例程需要知道记录的 ID 才能关联图像,但这只有在调用 save() 之后才会创建。 有没有办法在模型保存之前获取 ID?或其他一些解决方法
提前感谢大家
鲁迪
【问题讨论】:
几个解决方案:
更改您的工作流程,以便只有在保存主模型(并具有 id)后才能将图像链接到主模型。
在创建主模型之前不要将图像保存到数据库中。您可以将它们存储在会话中,或者在用户添加更多字段时继续将字段附加到表单的末尾。
【讨论】:
可能不会,因为ID会由数据库设置,而不是CakePhp,只有数据库自动增加ID字段后才能知道ID...
不确定您的流程如何,但我想您可以在控制器获取页面时(当 $this->data 为空时)将虚拟/空行保存到数据库中而无需所有关联。您知道数据库中有一个空行的 ID,例如“12,NULL,NULL,NULL,NULL,NULL,...”。然后,您可以存储该虚拟记录的 ID(或执行 $this->set("id", $id) 将其传递给视图以在您的 ajax 调用中使用)。 在您的页面 POST 之后,您可以使用 ID 将所有其他信息存储在虚拟行中,或者当出现故障/用户导航离开时从数据库中删除虚拟行...
【讨论】:
选项1:
您可以尝试使用 UUID 而不是 INT。这样,您就可以使用 CakePHP 生成一个 ID:String::uuid();。
创建后,您可以填充一个 id 字段,然后使用该 id 保存项目。
如果我在做银行软件或其他重要的事情,我不确定我是否会依赖它的独特性,但是 - 有十亿分之一的机会被复制,对于普通的网站/软件来说,似乎是这样的就够了。
选项2:
在我们的许多项目中,我们发现有一个非常简单的“创建事物”页面很有帮助,只有一个标题字段,然后,一旦保存,它会立即将它们带到更深入的“编辑" 他们可以上传文件、保存额外数据等的页面。几乎就像 pg1、pg2。这样,文件以及任何其他由 ajax 驱动的动态数据都将有一个 ID 可供使用。
【讨论】:
【讨论】:
String::uuid()时检查数据库表中是否存在id。我认为获得非唯一ID的机会非常非常小,但仍然是一个机会。而且在编程时,我不相信“机会”,我希望 100% 控制正在发生的事情。所以这可能是使用这种方法时需要考虑的事情:)