2013-07-19 6 views
2

저는 CakePHP 1.3을 사용하고 있습니다. 새로운 레코드이거나 이미 존재하는 경우 기존 레코드를 업데이트하는 경우 루프에 새 레코드 (수천 ~ 수천)를 삽입하려고합니다. 그러나 내가 저장하는 방식은 레코드가 이미 존재하는지 여부를 확인하지 않습니다. 대신 각 레코드에 기본 키 값을 할당합니다. 이 ID는 고유하게 보장됩니다. 이 ID가 존재하지 않는다면 CakePHP는 삽입을 알리고 그렇지 않으면 업데이트합니다.CakePHP 1.3 : 레코드를 삽입하거나 업데이트하는 올바른 방법

그러나 나는 올바른 방법으로하고 있는지 잘 모르겠습니다. 나는 새로운 레코드를 만들 때 을 루프이라면 $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 디버깅을 켜면 save() 전에 ID를 지정하면 Cake가 데이터베이스에서 레코드를 가져 오는 것을 볼 수 있습니다. 레코드가 존재하면 Cake는 업데이트를 수행하고 그렇지 않으면 삽입을 수행합니다. ID에 NULL을 지정하면 강제로 삽입됩니다. 그래서 당신이하고있는 것은 괜찮습니다.

create()은 모든 열을 채우지 않을 경우 중요합니다. 그렇지 않으면 데이터가 객체에 남아있어 하나의 레코드에서 다른 레코드로 데이터를 유출하게됩니다. create은 단순히 내부 데이터 구조를 다시 설정합니다.

실제로 편집증 환자가 아니라면 save() 이후에 데이터가 있는지 확인할 필요가 없습니다. 그러나 save()에서 결과를 확인하십시오; false를 반환하면 무엇인가 잘못되었습니다.

+0

'흘린 데이터'부분에 대해 자세히 설명해 주시겠습니까? 내 데이터 배열에 반드시 모든 열이 정의되어있는 것은 아닙니다. 아마도 그 예가 있을까요? – musicliftsme

+0

"spilling data"라는 말은 다음과 같습니다. "bar"열에 "foo"값으로 레코드를 업데이트한다고 가정하십시오. 다음 루프에서는 새 레코드를 만들지 만 create()를 호출하거나 "bar"를 설정하지 마십시오. 이 경우 새 레코드에도이 열에 "foo"가 포함됩니다. 네가 원하지 않을 수도있는 어떤 것. 그래서 매번 create()를 호출하는 것이 좋습니다. – JvO