2013-07-19 89 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

相關問題