Doctrine orm 条令2自参考实体获胜';t返回父id

Doctrine orm 条令2自参考实体获胜';t返回父id,doctrine-orm,Doctrine Orm,我已根据此处的手册设置了自引用实体: 我的类是Page(而不是像文档中那样的Category)。在我的实体中 类,我实现了一个toArray()方法,该方法将 返回成员变量的值。对于那些 关联,我确保抓取关联的类对象 获取id。我这样做是为了填充表单。这是来自的代码 我的页面实体和页面服务中的my toArray()方法 函数获取调用的页面对象和我的页面控制器代码 toArray()来填充我的表单 正如我在代码注释中所说,当调用toArray()方法时 在页控制器中,除父id外,所有值都将填

我已根据此处的手册设置了自引用实体:

我的类是Page(而不是像文档中那样的Category)。在我的实体中 类,我实现了一个toArray()方法,该方法将 返回成员变量的值。对于那些 关联,我确保抓取关联的类对象 获取id。我这样做是为了填充表单。这是来自的代码 我的页面实体和页面服务中的my toArray()方法 函数获取调用的页面对象和我的页面控制器代码 toArray()来填充我的表单

正如我在代码注释中所说,当调用toArray()方法时 在页控制器中,除父id外,所有值都将填充。 page_类型也是一个多通关联,它不会被填充 问题从页面对象显式获取父id 在toArray()方法之外(在页控制器中)不返回 父id值。(参见代码。)


作为补充说明,我在页面实体中使用了uu get()和u set(),而不是完整的getter/setter。

不确定到底是什么导致了所描述的行为,但无论如何,让toArray()方法调用getter/setter可能比让toArray()直接对类属性进行操作要好。这将为您提供一致性,因此,如果您为某些属性实现自定义getter,您将始终从toArray()和getter返回相同的结果

一个粗略的例子:

<?php
/** @Entity */
class MyEntity {

    // ....

    /** @Column */
    protected $foo;


    public function setFoo($val)
    {
        $this->foo = $val;
    }

    public function getFoo()
    {
        return 'hello ' . $this->foo;
    }

    public function toArray()
    {
        $fields = array('foo');
        $values = array();
        foreach($fields as $field) {
            $method = 'get' . ucfirst($field);
            if (is_callable(array($this, $method)) {
                $fields[$field] = $this->$method();
            } else {
                $fields[$field] = $this->$field;
            }
        }
        return $fields;
    }
}

我认为这是因为你被代理抓住了。当在原则2中有关联时,相关对象不会直接作为对象返回,而是作为子类返回,这些子类在调用方法之前不会填充其属性(因为延迟加载以保存数据库查询)

由于您直接调用属性(使用$this->parent->id),而不调用任何方法,因此对象属性都是空的


此页面在警告框中有一个关于此类事件的警告。虽然您的不是公共属性,但您正在像访问一样访问它,因为该对象属于同一类,并且出现了相同的问题。

我刚刚发现,如果我直接实现getId()getter并在toArray()方法中使用它,它将返回id值。为什么,这是个问题。为什么在toArray()方法之外(在我的控制器中)直接获取值(没有完整的getter)是可行的?我使用的是_get()和_set()方法,它们允许您访问对象属性,就像它们是公共的一样。我使用相同的方法从同一类的另一个关联(page_类型)检索id,效果很好。这个问题与这个特定的关联直接相关,我觉得这一定与它是对同一类型实体的引用这一事实有关。另外,正如我前面提到的,我可以在toArray()方法之外直接调用父id,并且它可以正常工作。只有在toArray()方法中,它才不会检索该值。\uuuu get和\uu set仅对不可访问的属性起作用。因为它属于同一个类,它们是可访问的,所以它只是直接访问私有属性。但是因为没有调用函数,代理还没有加载,所以所有的值都是空的。好的,我明白你现在说的了。但是,即使在我的toArray()方法中,这个值也会出现问题。我可以在toArray()方法中直接访问页面类型id,没有问题。”page\u type'=>$this->page\u type->id据我所知,在我的toArray()调用之前,没有任何其他代码会加载带有page\u type值的代理。
<?php
$e = new MyEntity;
$e->setFoo('world');
$e->getFoo(); // returns 'hello world'
$e->toArray(); // returns array('foo' => 'hello world')