0

我有三个班。该课程由阶段组成。阶段由步骤组成。

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 读取数据时:致命错误:在第 104 行* *extensions\YiiMongoDbSuite\extra\EEmbeddedArraysBehavior.php中的非对象上调用成员函数 toArray()

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

帮助我防止致命错误致命错误:调用 EMongoDocument.php 中非对象上的成员函数 setAttributes()

于 2015-03-13T14:29:57.353 回答
0

GitHub 上似乎有多个版本的YiiMongoDbSuite。您使用的是canni/YiiMongoDbSuite v1.3.6.3吗?

查看EEmbeddedArraysBehavior.phpbeforeToArray()中的方法,代码似乎访问了该属性,然后立即对其进行迭代。如果您文档中的字段是,我看不到行为代码中的第一次检查将如何通过。我建议调试函数并在迭代之前检查保存到属性的位置周围的属性值。我的猜测是它可能是一个具有单个元素的数组,其值为.stages.0.stepsnullis_array()stages_cacheforeach()null

于 2013-09-03T16:27:47.557 回答