【问题标题】:CakePHP 1.3: proper way to insert or update recordsCakePHP 1.3:插入或更新记录的正确方法
【发布时间】:2013-07-19 16:15:43
【问题描述】:

我使用的是 CakePHP 1.3,如果新记录是新记录,我将在循环中插入新记录(几至几千个),或者如果它们已经存在,则更新现有记录。但是我保存的方式并没有检查记录是否已经存在;相反,我在每条记录中分配了一个主键值。我分配的这个 ID 保证是唯一的。如果此 ID 不存在,CakePHP 似乎知道插入,否则更新。

但是,我不确定我的做法是否正确。我读了here,如果我要创建一个新记录在循环中,我需要做$this->create(),我在其他我知道的函数中实现了记录将是独一无二的。我不在这里这样做,因为它似乎可以正常工作,而且我不需要检查每条记录的存在。

我要插入或更新的每个记录数组都有一个键 id,它表示各个表中的主键,每个数组都包含正确关联的两个模型的数据。

例如

$this->saveAll($myData);

Array
(
    [MyModel] => Array
    (
        [id] => 123
        [xyz] => ...
        ...
    )
    [MySecondModel] => Array
    (
        [id] => 789
        [my_model_id] => 123
        [qwe] => ...
        ...
    )
)

我做的很好吗,或者我需要检查是否存在,如果需要的话,然后是$this->create()

【问题讨论】:

    标签: cakephp cakephp-1.3


    【解决方案1】:

    如果你打开 SQL 调试,你会看到如果你在save() 之前指定一个 ID,Cake 会从数据库中获取记录。如果记录存在,Cake 将执行更新,否则执行插入;为 ID 指定 NULL 会强制插入。所以你做的很好。

    如果您没有填写所有列,create() 很重要;否则数据将保留在对象中,您最终会将数据从一条记录溢出到另一条记录。 create 只是重置了内部数据结构。

    你不需要在save() 之后检查你的数据是否存在,除非你真的很偏执。但是,检查来自save() 的结果;如果返回 false 则出现问题。

    【讨论】:

    • 您能否详细说明“溢出数据”部分?我的数据数组不一定定义了所有列。也许是一个例子?
    • “溢出数据”我的意思是:假设您更新了“bar”列的值为“foo”的记录。在下一个循环中,您创建一条新记录,但不要调用 create() 或设置“bar”;在这种情况下,您的新记录也将在此列中包含“foo”。你可能不想要的东西。这就是为什么建议每次都调用 create() 的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多