我的情况:我有一个基于几个模型链接在一起的表格。在后台,我有一个保存图像的例程,基于对特定控制器的 ajax 调用,该控制器上传图像并将其实时显示在文本区域上。当我必须第一次保存记录时,我的问题适用,因为 ajax 例程需要知道记录的 ID 才能关联图像,但这只有在调用 save() 之后才会创建。有没有办法在模型保存之前获取 ID?或其他一些解决方法
在此先感谢大家
鲁迪
我认为@RichardAtHome 在这方面提供了很好的意见。我将添加您可能要考虑的第三种解决方案:
Use universally unique identifiers (UUID) for that model's primary key. CakePHP offers a way to generate them via the String
utility. So what you would do is generate the id when the page loads with String::uuid()
and then send it as part of the ajax requests.
几个解决方案:
更改您的工作流程,以便只有在保存主模型(并具有 id)后才能将图像链接到主模型。
在创建主模型之前,不要将图像保存到数据库中。您可以将它们存储在会话中,或者在用户添加更多字段时继续将字段附加到表单的末尾。
选项1:
您可以尝试使用 UUID 而不是 INT。这样,您可以只使用 CakePHP 生成一个 ID: String::uuid();
。
创建它后,您可以填充一个 id 字段,然后使用该 id 保存项目。
如果我在做银行软件或一些关键的事情,我不确定我是否会依赖它的独特性,但是 - 它有十亿分之一的机会被复制,对于普通的网站/软件来说,这似乎就足够了。
选项2:
在我们的许多项目中,我们发现有一个非常简单的“创建事物”页面很有帮助,只有一个标题字段,然后,一旦保存,它会立即将它们带到更深入的“编辑”页面,其中他们可以上传文件,保存额外的数据......等等。几乎就像一个pg1,pg2。这样,文件以及任何其他动态 ajax 驱动的数据都将有一个 ID 可以使用。
可能不会,因为ID将由数据库设置,而不是CakePhp,并且只有在数据库自动增加ID字段后才能知道ID...
不确定您的流程如何,但我想您可以在控制器获取页面时(当 $this->data 为空时)将一个虚拟/空行保存到数据库中而无需所有关联。您知道数据库中的空行有一个 ID,例如“12,NULL,NULL,NULL,NULL,NULL,...”。然后,您可以存储该虚拟记录的 ID(或执行 $this->set("id", $id) 将其传递给视图以在您的 ajax 调用中使用)。在页面的 POST 之后,您可以使用 ID 将所有其他信息存储在虚拟行中,或者在出现故障/用户导航离开时从数据库中删除虚拟行......