2013-07-19 83 views
2

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

但是,我不确定我是否以正确的方式进行操作。我读here如果我在一个循环创造了新的记录,我需要做$this->create(),这一点我在我知道每个记录将是独一无二的其他功能实现。我不这样做,因为它似乎没有错误地工作,我不需要再检查每条记录的存在。

我插入或更新的每个记录数组都有指示相应表中的主键的键id,并且每个数组都包含适当关联的两个模型的数据。

例如

$this->saveAll($myData); 

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

是我在做什么好,或者我需要检查它是否存在,然后$this->create(),如果有必要吗?

回答

2

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

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

save()之后,您不需要检查数据是否存在,除非您确实是偏执狂。但是,检查结果从save();如果返回false,则出现问题。

+0

您能否详细说明“溢出数据”部分?我的数据数组并不一定要定义所有的列。也许有一个例子? – musicliftsme

+0

通过“溢出数据”我的意思是这样的:假设你更新一个值为“foo”的记录栏“bar”。在下一个循环中,创建一个新记录,但不要调用create()或设置“bar”;在这种情况下,你的新纪录也将在这一栏中有“富”。你可能不想要的东西。这就是为什么建议每次调用create()。 – JvO