我想使用doctrine2实体管理器的getReference()函数。但是,在我请求已从数据库中删除的对象的情况下,如果我多次请求同一对象,我会获得一个代理。
//A random article object...that has been deleted from the database
$articleClass = 'Acme\ArticleBundle\Entity\Article';
$articleIdentifiers = array('id'=>1);
$i = 0;
//We ask for its reference twice
do{
try {
echo "a";
$subject = $this->em->getReference(
$subjectClass,
$subjectIdentifiers
);
//call this object now
var_dump($subject);
} catch (\Exception $e) {
echo "b";
}
$i++;
} while ($i <2);
a
b
a
object(Proxies\__CG__\Acme\ArticleBundle\Entity\Article)
如何获取数据库中不存在的对象的代理?如果我评论这一行,则entityManager不会管理该对象,并且我获得输出
abab
,这对我来说更有意义,因为我不想获取数据库中不存在的代理对象。作为信息,返回的代理对象具有其所有属性null
。因此,我获得了数据库中不存在的对象的代理。因此,如果我请求此对象,我会收到“未找到实体”异常。
有人能理解这一点吗?有没有办法依靠
getReference()
来告诉我们这个对象是否真的存在于数据库中?
无法让
getReference()
检查数据库中是否存在引用的对象。
实际上,这就是
getReference()
及其返回的代理的全部内容:创建占位符对象(代理)而不访问数据库。而且你很少会想明确地这样做。通常,Doctrine 在对实体进行水合时会在内部执行此操作,以根据外键值为相关实体创建延迟加载占位符。
为什么不在实体管理器上调用
find()
?您是否知道,只要您通过 ID 查找,EM 就不会多次向数据库查询同一个对象? Doctrine 跟踪工作单元中已经水合的对象,并在后续 find()
调用中返回对现有对象的引用。getReference
来获取一个对象,然后调用它的方法(例如
getName
),那么 Doctrine 将从数据库中获取该实体。它没有其他方法可以找到该属性(getName)。
EntityManager->contains($entity)
将是检查条令中的实体是否在实体管理器中的首选方法
$classChild = $this->doctrine->getReference($classReference, $id);
if (!$this->doctrine->contains($classChild)) {
throw new \Exception("Invalid Reference");
}
其中 $this->doctrine 是你的 EntityManager
$user = $this->getReference(UserFixtures::USER, User::class);
$news1 = (new News())
->setHeader('news test #1')
->setText('news test text #1')
->setTimePublic('11:00')
->setInitiator($user)
;
单独设置者时成功:
$user = $this->getReference(UserFixtures::USER, User::class);
$news1 = (new News())
->setHeader('news test #1')
->setText('news test text #1')
->setTimePublic('11:00')
;
$news1->setInitiator($user);