设置:
我有以下代码两个实体模型:
帐户,代表用户帐户并具有教室的外键。
<?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的初学者,我寻求进一步的意见/帮助来解决这个问题。
答案 0 :(得分:4)
来自Doctrine Architecture Documentation:
任何实体类的所有持久属性/字段应始终为私有或受保护,否则延迟加载可能无法按预期工作。
您的$classroom
属性为public
,这可能是与Classroom实体的关联没有延迟加载的原因。您应该将其更改为private
或protected
(我建议您为various reasons制作所有实体属性protected
。)
如果这不起作用,您可以尝试将fetch
关联的OneToOne
属性设置为EAGER,即
/**
* @OneToOne(targetEntity="Classroom", fetch="EAGER")
*/
protected $classroom;