CakePHP需要在保存之前知道模型ID

时间:2013-02-06 14:10:11

标签: cakephp save

我的情况: 我有一个基于连接在一起的几个模型的表单。 在后台我有一个保存图像的例程,基于对特定控制器的ajax调用,该控制器上传图像并实时显示在textarea上。 当我必须第一次保存记录时,我的问题适用,因为ajax例程需要知道关联图像的记录的ID,但是只有在调用save()之后才会创建。 有没有办法在模型保存之前获取ID?或其他一些解决方法

提前感谢所有人

鲁迪

4 个答案:

答案 0 :(得分:3)

我认为@RichardAtHome对此提供了很好的意见。我只想添加您可能要考虑的第三种解决方案:

为该模型的主键使用通用唯一标识符(UUID)。 CakePHP提供了一种通过String实用程序生成它们的方法。那么你要做的就是在页面加载String::uuid()时生成id,然后将其作为ajax请求的一部分发送。

答案 1 :(得分:2)

一些解决方案:

  1. 更改工作流程,以便一旦保存主模型(并且具有ID),图像只能链接到主模型。

  2. 在创建主模型之前,请勿将图像保存到数据库。您可以将它们存储在会话中,或者只是在用户添加更多字段时将字段附加到表单的末尾。

答案 2 :(得分:2)

<强>选项1:

您可以尝试使用UUID而不是INT。这样,您可以使用CakePHP生成ID:String::uuid();

创建它之后,您可以填充一个id字段,然后使用该ID保存项目。

我不确定如果我在做银行软件或其他重要的事情,我会依赖它的独特性,但是 - 它有十亿分之一的机会可以复制,对于普通网站/软件来说,似乎是就够了。

<强>选项2:

在我们的很多项目中,我们发现有一个非常简单的“创建一个东西”页面只有一个标题字段是有帮助的,然后,一旦保存,它会立即将它们带到更深入的“编辑” “他们可以上传文件的页面,保存额外的数据等等。几乎像pg1,pg2。这样,文件以及任何其他动态ajax驱动的数据都将具有可用的ID。

答案 3 :(得分:0)

可能不是,因为ID将由数据库设置,而不是CakePhp,并且只有在数据库自动递增ID字段后才能知道id ...

不确定你的流程是怎样的,但是我猜你可以在控制器获取页面时(当$ this-&gt;数据为空时)将虚拟/空行保存到数据库而没有所有关联。您知道数据库中的空行有一个ID,如“12,NULL,NULL,NULL,NULL,NULL,...”。然后,您可以存储该虚拟记录的ID(或者使用$ this-&gt; set(“id”,$ id)将其传递给视图以在您的ajax调用中使用)。 在您的页面POST之后,您可以使用ID将所有其他信息存储在虚拟行中,或者在某些操作失败/用户导航时从数据库中删除虚拟行...