2013-09-03 3 views
0

세 클래스가 있습니다. 코스는 스테이지로 구성됩니다. 단계는 단계로 구성됩니다. MongoDB를으로부터임베디드 문서 배열 YiiMongoDbSuite

{ 
    "name" : "course1", 
    "online" : "0", 
    "author_id" : ObjectId("521df3f1e405688411000029"), 
    "approved" : false, 
    "stages" : [ 
     { 
      "_id" : ObjectId("521dfd84e40568d80900002a"), 
      "name" : null, 
      "steps" : null, 
      "price" : null 
     }, 
     { 
      "_id" : ObjectId("5220c648e40568701c000031"), 
      "name" : null, 
      "steps" : [ 
       { 
        "_id" : ObjectId("5220c648e40568701c000032"), 
        "name" : null 
       } 
      ], 
      "price" : null 
     } 
    ], 
    "short_description" : "test", 
    "_id" : ObjectId("521dfd7ce40568d809000029") 
} 

제가 판독하려고 데이터 : MongoDB에있어서

class Course extends EMongoDocument{ 
.... 
    public function behaviors() 
    { 
     return array(
      'embeddedArrays' => array(
       'class'=>'ext.YiiMongoDbSuite.extra.EEmbeddedArraysBehavior', 
       'arrayPropertyName'=>'stages', 
       'arrayDocClassName'=>'Stage' 
      ), 
     ); 
    } 
} 

class Stage extends EMongoEmbeddedDocument{ 
... 
    public function behaviors() 
{ 
     return array(
      'embeddedArrays' => array(
       'class'=>'ext.YiiMongoDbSuite.extra.EEmbeddedArraysBehavior', 
       'arrayPropertyName'=>'steps', 
       'arrayDocClassName'=>'Step' 
      ), 
     ); 
} 
class Step extends EMongoEmbeddedDocument{ 
... 
} 

나 데이터가 치명적인 오류 *의 비 객체의 멤버 함수 toArray()를 호출 * 라인 (104)

$arrayOfDocs[] = $doc->toArray(); 

에 추가 \ EEmbeddedArraysBehavior.php \ 확장 \ YiiMongoDbSuite 단계는 모두가 잘 작동 단계가없는 경우. 내가 뭘 잘못 했니?

+0

아마도이 버그의 다른 버전을 시도해 보셨습니까? –

답변

0

GitHub에 YiiMongoDbSuite의 여러 버전이있는 것 같습니다. canni/YiiMongoDbSuite의 v1.3.6.3을 사용하고 있습니까?

beforeToArray() 메서드를 보면 EEmbeddedArraysBehavior.php에서 코드는 속성에 액세스 한 다음 즉시 반복기에 대한 것으로 나타납니다. 문서의 stages.0.steps 필드가 null 인 경우 동작 코드에서 첫 번째로 is_array() 체크가 통과하는 방식이 표시되지 않습니다. 함수 디버깅을 제안하고 stages 속성의 값을 검사하여 _cache 속성에 저장하고 foreach() 반복 전에 저장하는 것이 좋습니다. 내 생각 엔 값이 null 인 단일 요소가있는 배열 일 수 있습니다.

0

해결책을 찾았습니다. 임베디드 문서 필드의 값을 채우는 동안 임베디드 문서의 attributeNames() 함수에서 배열을 채우고 을 뒤집습니다. 등등. 따라서 NULL 값을 고치려면 해당 함수의 반환 배열을 채워야합니다. 내 코드는 당신을 도울 것입니다 :

<?php 
class Pricing extends EMongoEmbeddedDocument { 
    public $setup; 
    public $monthly; 
    public $annually; 
    public function rules() { 
     return array(
     ); 
    } 
    public function attributeNames() { 
     return array(
      'setup' => 'setup', 
      'monthly' => 'monthly', 
      'annually' => 'annually' 
     ); 
    } 
} 

public function setAttributes($values, $safeOnly=true) 
    { 
     if(!is_array($values)) 
      return; 

     if($this->hasEmbeddedDocuments()) 
     { 
      $attributes=array_flip($safeOnly ? $this->getSafeAttributeNames() : $this->attributeNames()); 

      foreach($this->embeddedDocuments() as $fieldName => $className) 
       $this->$fieldName = new $className; 
       if(isset($values[$fieldName]) && isset($attributes[$fieldName])) 
       { 
        $this->$fieldName->setAttributes($values[$fieldName], $safeOnly); 
        unset($values[$fieldName]); 
       } 
     } 

     parent::setAttributes($values, $safeOnly); 
    } 

날 치명적인 오류 치명적 오류를 방지하는 데 도움이 코드 : EMongoDocument.php

에 비 개체의 멤버 함수의 setAttributes()를 호출