我在这里根据手册设置了一个自引用实体:
我的课程是Page(而不是分类,就像在文档中一样)。在我的实体 class I我已经实现了一个toArray()方法 我支持我的成员变量的值。对于那些领域 关联,我确保然后获取关联的类对象 抓住身份证。我这样做是为了填充表格。这是代码 我的Page实体以及我的PageService中的toArray()方法 函数来获取一个Page对象和我调用的Page Controller代码 toArray()填充我的表单。
正如我在代码注释中所说,当调用toArray()方法时 页面控制器,除了父ID之外,所有值都会被填充。 page_type也是一个ManyToOne关联,它将被填充为no 问题。从Page对象中明确地获取父ID 在toArray()方法之外(在页面控制器中)确实返回 父ID值。 (见代码。)
作为旁注,我在我的Page实体中使用__get()和__set()而不是完整的getter getter / setter。
答案 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')