2013-09-03 5 views
0

J'ai trois classes. Le cours comprend les étapes. Les étapes comprend les étapes.Tableau de documents incorporés YiiMongoDbSuite

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{ 
... 
} 

En mongodb j'ai données:

{ 
    "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") 
} 

Lorsque je tente de lire les données de MongoDB: Erreur fatale: Appel à une fonction de membre toArray() sur un non-objet dans * * extensions \ YiiMongoDbSuite \ supplémentaires \ EEmbeddedArraysBehavior.php sur la ligne 104

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

Si scène ne sont pas tout fonctionne très bien. Ce que je fais mal?

+0

C'est probablement bug, avez-vous essayé une autre version de ce comportement? –

Répondre

0

Il semble y avoir plusieurs versions de YiiMongoDbSuite sur GitHub. Utilisez-vous la version 1.3.6.3 de canni/YiiMongoDbSuite?

En regardant la méthode beforeToArray() dans EEmbeddedArraysBehavior.php, le code semble accéder à la propriété, puis immédiatement l'itérateur. Si le champ stages.0.steps dans votre document est null, je ne vois pas comment la première vérification is_array() dans le code de comportement passera. Je suggère de déboguer la fonction et d'inspecter la valeur de la propriété stages autour de l'endroit où elle est enregistrée dans la propriété _cache et avant l'itération foreach(). Ma conjecture est que ce peut être un tableau avec un seul élément dont la valeur est null.

0

J'ai trouvé une solution. Lors du remplissage des valeurs pour les champs de document incorporés, il obtient un tableau (que remplir) à partir de la fonction attributeNames() de ce document incorporé, puis flip et ainsi de suite. Donc, pour fixer les valeurs NULL, vous devez remplir le tableau de retour de cette fonction. Mon code vous aidera à:

<?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' 
     ); 
    } 
} 

également ce code

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); 
    } 

m'a aidé à prévenir toute erreur fatale Erreur fatale: appel à une setAttributes fonction membre() sur un non-objet dans EMongoDocument.php

Questions connexes