2013-05-26 2 views
0

좋아, 나는이 사이트와 Google에서 많은 검색을 수행하고 답변을 찾았지만 그 중 아무 것도 작동하지 않았다. 나는 또한 @ ichikaway의 사이트와 테스트 절차를 체크 아웃했다. 거기에있는 물건조차 나를 위해 일하지 않습니다. 또한 'if'문으로 저장/업데이트를 래핑 할 때 항상 true를 반환하므로 수행 할 수있는 디버깅이 많지 않습니다.CakePHP에서 서브 문서 배열에 어떻게 추가/삽입 할 수 있습니까?

다음은 나를 솔루션으로 안내하는 데 도움이되는 관련 코드입니다. 감사! 내 StudentsController에서

MyClass의 모델 정의

class MyClass extends AppModel 
{ 
var $name = 'MyClass'; 
var $useTable = 'my_classes'; 

//var $belongsTo = array(); 
//var $hasMany = array(); 

var $useDbConfig = 'mongo'; 

var $mongoSchema = array(
     '_id' => array('type' => 'integer', 'primary' => true, 'length' => 40), 
     'children' => array(
       'child_id' => array('type' => 'integer','length' => 40), 
       'child_first_name' => array('type'=>'string'), 
       'child_last_name'=>array('type'=>'string'), 
       'active'=>array('type' => 'integer', 'length' => 1), 
     ), 
     'teachers' => array(
       'teacher_id' => array('type' => 'integer','length' => 40), 
       'teacher_first_name' => array('type'=>'string'), 
       'teacher_last_name'=>array('type'=>'string'), 
       'primary'=>array('type' => 'integer', 'length' => 1), 
       'active'=>array('type' => 'integer', 'length' => 1), 
     ), 
     'name' => array('type'=>'string'), 
     'active'=>array('type' => 'integer', 'length' => 1), 
     'created'=>array('type'=>'datetime'), 
     'modified'=>array('type'=>'datetime'), 
     ); 
} 

코드

$currentClass = $this->data["MyClass"]["id"]; 

$classtoedit = $this->MyClass->findById($currentClass); 

$addChildToClass = array(
    'MyClass' => array('id'=>$currentClass, 
    '$push' => 
     array('children' => 
     array('child_id'=>$newChildId, 
      'child_first_name'=>$first_name, 
      'child_last_name'=>$last_name, 
      'active'=> 1) 
     ) 
    ) 
    ); 

print_r($addChildToClass); 
$this->MyClass->id = $currentClass; 
if($this->MyClass->save($addChildToClass)) 
{ 
$this->Session->setFlash("Your child has been successfully added."); 

} 

편집 : 나는 단지 PHP 기간을 통해 필요한 기능을 얻을 수 있었다, 그러나 다시, 정말 원하는 CakePHP에서 올바른 방법으로 사용하십시오. 차라리 나올 수도있는 다른 관리자들과 함께 두 가지를 섞어서는 안됩니다. FYI

+0

$ currentClass = $ this-> data [ "MyClass"] [ "id"]; "id"가 아닌 "_id"를 참조하고 있습니까? $ this-> MyClass-> id와 동일합니다. 이미 $ classtoedit을 가지고 있습니까? –

+0

나는 그렇게 생각했을 것이다. 그러나 그것은 무엇인가의 이유로하지 않는다. 데이터베이스에서는 _id이지만 CakePHP에서 수신되면 그냥 "id"입니다. 그 부분은 잘 작동하는 것 같다. 내가 일할 수없는 서브 디스트 물건 일뿐입니다. – DarkUnderlord

+0

데이터 배열에서 "_id"'로 변경하면 다음과 같이 나타납니다. E11000 중복 키 오류 인덱스 : weebehavedev.my_classes. $ _ id_ dup 키 : {: ObjectId ('51a051f9f1d0bab103000000')} – DarkUnderlord

답변

0

documentation에서 mongoNoSetOperator을 사용해야 할 것으로 보입니다.

tests에는 사용 예가 나와 있습니다.

id 대신 _id을 사용해야한다고 생각합니다. 사용 케이스에서는 기존 레코드를 업데이트하려고 시도하므로 드라이버 코드가 update이 아닌 insert이 아니라면 중복 키 예외가 발생합니다.

+0

불행히도 나는 그 모든 것을 시도했다. 설명 할 수는 없지만 결국에는 PHP를 통해서만 수행하기로 결정했습니다. 매력처럼 작동하지만 CakePHP 프레임 워크에 머물 수는 없습니다. – DarkUnderlord

0

내가 강조하고 싶은 두 가지, 내가 틀렸다면 알려주세요.

1) 왜 두 번 ID 배열 변수 $addChildToClass에서 하나를 설정하는 다른 $this->MyClass->id = $currentClass;

2) 키 ''$ 푸시 'in the $ addChildToClass`은 무엇입니까? 이 같은 뭔가 배열을 다할 것입니다 경우

내가 어떤 식 으로든 당신이 필드를 업데이트하기 전에 ID를 설정하기 때문에 그때는

$addChildToClass = array(
    array('children' => 
    array('child_id'=>$newChildId, 
     'child_first_name'=>$first_name, 
     'child_last_name'=>$last_name, 
     'active'=> 1) 
) 
); 

작동합니다 .. 생각합니다.

+0

'$ this-> MyClass-> id = $ currentClass; '가 아마도 필요하지 않다는 것이 맞습니다. 업데이트하려는 현재 레코드를 설정하는 것이 마지막 기회였습니다. CakePHP는이를 전형적인 데이터베이스와 함께 사용하므로, 무엇을 대체 할지를 생각합니다. 유무에 상관없이 같은 일을했기 때문에 상처를 입을 수 없었습니다. $ 밀어에 관해서는, 그것은 현재 속성과 값을 덮어 쓰지 않고 하위 문서 배열에 추가하는 데 꼭 필요합니다. – DarkUnderlord