【问题标题】:CakePHP need to know model ID before savingCakePHP 在保存之前需要知道模型 ID
【发布时间】:2013-01-21 18:30:43
【问题描述】:

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

提前感谢大家

鲁迪

【问题讨论】:

    标签: cakephp save


    【解决方案1】:

    几个解决方案:

    1. 更改您的工作流程,以便只有在保存主模型(并具有 id)后才能将图像链接到主模型。

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

    【讨论】:

      【解决方案2】:

      可能不会,因为ID会由数据库设置,而不是CakePhp,只有数据库自动增加ID字段后才能知道ID...

      不确定您的流程如何,但我想您可以在控制器获取页面时(当 $this->data 为空时)将虚拟/空行保存到数据库中而无需所有关联。您知道数据库中有一个空行的 ID,例如“12,NULL,NULL,NULL,NULL,NULL,...”。然后,您可以存储该虚拟记录的 ID(或执行 $this->set("id", $id) 将其传递给视图以在您的 ajax 调用中使用)。 在您的页面 POST 之后,您可以使用 ID 将所有其他信息存储在虚拟行中,或者当出现故障/用户导航离开时从数据库中删除虚拟行...

      【讨论】:

        【解决方案3】:

        选项1:

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

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

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

        选项2:

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

        【讨论】:

          【解决方案4】:

          我认为@RichardAtHome 在这方面提供了很好的意见。我将添加您可能要考虑的第三种解决方案:

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

          【讨论】:

          • 感谢您的建议:我使用了这种方法,现在一切都像魅力一样!谢谢
          • 额外思路:使用String::uuid()时检查数据库表中是否存在id。我认为获得非唯一ID的机会非常非常小,但仍然是一个机会。而且在编程时,我不相信“机会”,我希望 100% 控制正在发生的事情。所以这可能是使用这种方法时需要考虑的事情:)
          • @jelmer UUID 的熵为 122 位,因此两个随机 UUID 碰撞的几率约为 10^-37,我会抓住机会 - 或者买彩票
          猜你喜欢
          • 2012-09-26
          • 1970-01-01
          • 2011-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-30
          • 2018-11-10
          相关资源
          最近更新 更多