0

私は3つのクラスを持っています。コースはステージで構成されています。ステージはステップで構成されています。

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

mongodbにはデータがあります:

{
    "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 からデータを読み込もうとすると: Fatal error: Call to a member function toArray() on a non-object in * *extensions\YiiMongoDbSuite\extra\EEmbeddedArraysBehavior.php 行 104

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

ステージにステップがない場合、すべて正常に動作します。私は何を間違っていますか?

4

2 に答える 2

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

致命的なエラーを防ぐのに役立ちました Fatal error: Call to a member function setAttributes() on a non-object in EMongoDocument.php

于 2015-03-13T14:29:57.353 に答える