【问题标题】:CakePHP: Insert record with specific idCakePHP:插入具有特定ID的记录
【发布时间】:2013-01-11 22:54:59
【问题描述】:

这与CakePHP: Is it possible to insert record with pre-defined primary key value? 本质上是同一个问题。在 CakePHP 1.2 中,我想插入一条具有预定 id 的记录。 id 的值由外部系统确定,但与链接问题不同,我无法控制该系统,因此该问题的解决方案对我来说不是一个选项。

如果调用$model->save()时设置了模型的id字段,Cake会一直尝试更新记录。如果不存在具有该 id 的记录,Cake 甚至会将 id 设置为 false [1]:

<?php
function save($data = null, $validate = true, $fieldList = array()) {
    // snip
    if (!$this->__exists && $count > 0) {
        $this->id = false;
    }
    // snip
}

先保存模型然后手动更新 id 也不是一种选择,因为这会破坏引用完整性(这是我也无法控制的架构限制)。

那么如何强制 CakePHP 插入带有特定主键的记录呢?

我面临的问题的一些背景:

我正在处理的应用程序由 Postgres 数据库支持,因此新的主键由序列确定。有一个过程,外部系统将 SELECT nextval('my_model_sequence'),使用该 id 做一些工作,然后将其传递给 CakePHP 应用程序,我想在其中 INSERT 具有该 id 的 my_model 记录。

保存记录后,我无法调用外部进程。我也根本无法修改外部流程。


[1]http://api12.cakephp.org/view_source/model/#l-1260

【问题讨论】:

    标签: php cakephp cakephp-1.2


    【解决方案1】:

    如果您想创建具有特定 id 的记录,请确保填写 id 字段

       $this->data['ModelName']['id'] = $your_id;
    

    在调用之前:

        $this->save($this->data);
    

    你应该记得打电话

    $this->create();
    

    这将重置模型状态,让您创建新记录。 最后你应该试试:

       $this->ModelName->create(); 
       $this->ModelName->save($this->data);
    

    另一方面,当我阅读您的帖子并试图想象您的表结构时,我建议您考虑不要单独使用 id 字段并尝试使这个外键 id 成为外键。这对你来说是一个选择吗?

    【讨论】:

    • 这不起作用。如问题中所述,如果应为 save()d 的记录尚不存在,Cake 将始终将 ID 设置为 false。外键不是一种选择。我会更新问题以明确这一点。
    • 好吧,我在那儿有点匆忙。这确实有效。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多