2012-08-28 4 views
0

나는 CakePHP를 다루기 시작했고 문서를 읽었지만 아직 두 가지가 나에게 서툴러 보인다.CakePHP에서 레코드를보다 쉽게 ​​처리 할 수 ​​있습니까?

  1. 나는 내가 저장하고 싶은 특정 기록이 다른 프레임 워크를 알고 있지만, CakePHP는 익명으로 할 날을 제안 :

    $this->Foo->create(array(...)); 
    $this->Foo->save(); 
    

    왜 내가 CakePHP는 말할 수 없습니다 어떤 기록은 다른 모든 프레임 워크와 같은 저장 :

    $foo = $this->Foo->create(array(...)); 
    $foo->save(); 
    
  2. 내가 컨트롤의 내부 전체 레코드 집합을 반복하고 싶습니다 너. 이렇게하는 이유는 find()는 2 차원 배열을 반환하고 내부 배열의 레코드 만이 왜 이해가 안

    $foos = $this->Foos->find('all'); 
    foreach($foos as $foo){ 
        $foo['Foo'] // ... here we have $foo. 
    

    사용하여 반복해야합니다. 왜 이것이 바로 레코드 배열이 아닌가?

답변

1
  1. $ this-은> 푸는 푸 모델의 인스턴스입니다. 메서드를 호출 할 때 Foo 모델 인스턴스의 활성 레코드 (있는 경우)에 메서드를 호출합니다. 따라서 Cake에게 어떤 레코드를 저장 할지를 말하면서, 현재의 활성 레코드를 저장하는 것을 Cake는 알고있을 필요가 없습니다.

다음은 댓글과 함께 붙여 넣은 코드입니다. 도움이됩니다.

// Prepare this instance of the Foo model to save a new record 
$this->Foo->create(array(...)); 

// Save the new record that we have just prepared 
$this->Foo->save(); 

그리고 다른 방법

...

// Call the create method on this instance of the Foo model, and return what? 
// Return another instance of the Foo model? 
// Why not just continue using the instance we already have, ie, $this->Foo 
$foo = $this->Foo->create(array(...)); 

// Call the save method on the duplicate instance of the Foo model that was 
// returned from the create method? 
$foo->save(); 

// Why did 'create' need to return a duplicate instance of the model to do a save??? 
// Why not call the save on the same instance of the Foo model that we used to call the create? 

포인트 2.이 일관성을 위해 기본적으로. 종종 서로 연결된 여러 테이블의 데이터를 반환합니다. Foo와 Bar 테이블에 1 대 1의 관계가 있고, 관련 바 레코드와 함께 Foo 레코드를 얻는다고 가정 해 보겠습니다. 반환 된 배열에는 Foo와 Bar 키가 필요합니다. 예 : foreach 루프 내부에 $ foo에 들어있을 수 있습니다. :

$ foo [ 'Foo'] [ 'column2'], $ foo [ 'Bar'] [ 'column1'], $ foo [ 'Bar' ] [ 'column2']

일관성을 유지하기 위해 하나의 테이블에서만 가져올 때 조인 된 데이터를 가져온 경우와 마찬가지로 $ foo [ 'Foo'] [ 'column1'] 형식으로 반환됩니다. 여러 테이블에서.

편집 :

$foos = $this->Foos->find('all'); 

당신이, 당신이 그것을 할 수있는 몇 가지 방법이 있습니다 당신의 반환 된 배열의 각 행에 대한 몇 가지 모델 메소드를 호출하고 싶었 말 : 귀하의 코멘트에 대한 응답으로 코드를 가지고 있다고 . 모델에 따라서

// This is code for the controller 
$this->Car->find('all'); 
foreach($cars as $car){ 
    $this->Car->driveTwoMiles($car); // the driveTwoMiles would be in your model class 

} 

, 당신은 방법이있을 것이다 : 한 가지 방법은 무엇인가처럼

// This would be a method in your model class 
function driveTwoMiles($car){ 
    $this->id = $car['Car']['id']; // set the active record 
    // we are now inside the model, so $this->id is the same as calling $this->Car->id from the controller 

    // Do whatever you want here. You have an active record, and your $car variable, holding data 
    $this->Post->saveField('distance_driven', $car['Car']['distance_driven']+2); 
} 

또한, 당신은 단지 하나 개의 기록이 아니라 많은 작업을 수행 할 수 있습니다를 업데이트 할 경우에 아래의 링크에서 "find ('all')"보다는 "read"를 수행하십시오.

내가보기 엔 케이크에이 페이지를 통해 모든 방법을 읽는 것은 추천 요리 할 책 :

http://book.cakephp.org/2.0/en/models/retrieving-your-data.html - 데이터 검색

http://book.cakephp.org/2.0/en/models/saving-your-data.html - 데이터를 저장

http://book.cakephp.org/2.0/en/models/deleting-data.html - 데이터 삭제

모든 Cake Models로 작업하는 방법에 대한 중요한 정보를 포함하고 있습니다. 시간을내어 실제로 이해하십시오. 앞으로도 무수한 두통과 코드 재사용을 줄일 수 있습니다!

+0

자세한 답변을 보내 주셔서 감사합니다. 요점 2 : 그러나 이것들은 객체가없는 원시 데이터 배열 일뿐입니다. 그런 식으로'$ car-> driveTwoMiles()'또는'$ car-> getDrivers()'와 같은 모델의 메서드를 호출 할 수 없습니다. CakePHP에서 이것을 할 수 없습니까? – YMMD

+0

나는 내 대답을 편집했다. –

+0

방금 ​​편집 한 내용을 다시 편집했습니다 ... 편집하는 동안 읽는다면 미안 해요.하지만 이제는 더 이해가 돼야합니다! –

관련 문제