gpt4 book ai didi

symfony - Doctrine 实体管理器的 getReference()

转载 作者:行者123 更新时间:2023-12-02 11:59:56 24 4
gpt4 key购买 nike

情况:

我想使用 getReference() doctrine2 实体管理器的功能。但是,在我请求一个已从数据库中删除的对象的情况下,如果我多次请求同一对象,我会获得一个代理。

示例:

//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)

如何获取数据库中不存在的对象的代理?如果我评论this line ,entityManager 不管理该对象,并且我获得输出 abab,这对我来说更有意义,因为我不想获取数据库中不存在的代理对象。有关信息,返回的代理对象的所有属性 null。因此,我获得了数据库中不存在的对象的代理。因此,如果我请求此对象,我会收到“未找到实体”异常。

挑战

有人能理解这一点吗?有没有办法依靠getReference()来告诉我们这个对象是否真的存在于数据库中?

最佳答案

无法让 getReference() 检查数据库中是否存在引用的对象。

实际上,这就是 getReference() 及其返回的代理的全部内容:创建占位符对象(代理)而不访问数据库。而且你很少会想明确地这样做。通常,Doctrine 在混合实体时会在内部执行此操作,以根据外键值为相关实体创建延迟加载占位符。

为什么不在实体管理器上调用 find() 呢?您是否知道,只要您通过 ID 查找,EM 将不会多次查询数据库来查找同一对象? Doctrine 跟踪工作单元中已经水合的对象,并在后续 find() 调用中返回对现有对象的引用。

关于symfony - Doctrine 实体管理器的 getReference(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16456090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com