Doctrine 2 OneToOne实体映射返回空实体

时间:2011-08-06 16:55:39

标签: orm doctrine mapping doctrine-orm

设置:

我有以下代码两个实体模型:

帐户,代表用户帐户并具有教室的外键。

<?php
namespace models;

/**
 * @Entity
 */
class Account
{
    /**
     * @Id @Column(type="integer")
     * @GeneratedValue(strategy="AUTO")
     */
    public $id;

    /**
     * @OneToOne(targetEntity="Classroom")
     */
    public $classroom;
}

代表学生入学课堂的课堂。

<?php
namespace models;

/**
 * @Entity
 */
class Classroom
{
    /**
     * @Id @Column(type="integer")
     * @GeneratedValue(strategy="AUTO")
     */
    public $id;

    /**
     * @Column(type="string")
     */
    public $name;
}

问题:

当我$account = $em->find('Account',$id);时,我正确地从数据库中获取帐户,但$account->classroom;是一个空(非空)对象。在尝试了一下后,我尝试在执行之前添加以下命令:

$em->getRepository('Classroom')->findAll().

然后我执行了$em->find('Account', $id );并且帐户对象中的教室对象正确返回。

猜测:

我认为实体从数据库加载和缓存的方式有问题,因为如果我在执行find()之前加载所有教室对象(或与帐户I关联的对象),一切都很好。

由于我是PHP和Doctrine的初学者,我寻求进一步的意见/帮助来解决这个问题。

1 个答案:

答案 0 :(得分:4)

来自Doctrine Architecture Documentation

  

任何实体类的所有持久属性/字段应始终为私有受保护,否则延迟加载可能无法按预期工作

您的$classroom属性为public,这可能是与Classroom实体的关联没有延迟加载的原因。您应该将其更改为privateprotected(我建议您为various reasons制作所有实体属性protected。)

如果这不起作用,您可以尝试将fetch关联的OneToOne属性设置为EAGER,即

/**
 * @OneToOne(targetEntity="Classroom", fetch="EAGER")
 */
protected $classroom;
相关问题