Doctrine 2自引用实体不会返回父ID

时间:2011-03-18 15:23:55

标签: doctrine-orm

我在这里根据手册设置了一个自引用实体:

http://www.google.com/url?sa=D&q=http://www.doctrine-project.org/docs/orm/2.0/en/reference/association-mapping.html%23one-to-many-self-referencing

我的课程是Page(而不是分类,就像在文档中一样)。在我的实体 class I我已经实现了一个toArray()方法 我支持我的成员变量的值。对于那些领域 关联,我确保然后获取关联的类对象 抓住身份证。我这样做是为了填充表格。这是代码 我的Page实体以及我的PageService中的toArray()方法 函数来获取一个Page对象和我调用的Page Controller代码 toArray()填充我的表单。

http://pastie.org/1686419

正如我在代码注释中所说,当调用toArray()方法时 页面控制器,除了父ID之外,所有值都会被填充。 page_type也是一个ManyToOne关联,它将被填充为no 问题。从Page对象中明确地获取父ID 在toArray()方法之外(在页面控制器中)确实返回 父ID值。 (见代码。)

作为旁注,我在我的Page实体中使用__get()和__set()而不是完整的getter getter / setter。

2 个答案:

答案 0 :(得分:1)

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

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

此页面http://www.doctrine-project.org/docs/orm/2.0/en/tutorials/getting-started-xml-edition.html#a-first-prototype在警告框中有关于此类事情的警告。虽然你的不是公共财产,但你正在访问,因为该对象属于同一类,并且出现了同样的问题。

答案 1 :(得分:0)

不确定究竟是什么导致了你描述的行为,但是你可能更好的方法是让你的toArray()方法调用getters / 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;
    }
}

现在你得到相同的结果:

<?php
$e = new MyEntity;
$e->setFoo('world');
$e->getFoo(); // returns 'hello world'
$e->toArray(); // returns array('foo' => 'hello world')