学说实体管理器的getReference()

问题描述 投票:0回答:4

情况:

我想使用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()
来告诉我们这个对象是否真的存在于数据库中?

symfony doctrine-orm doctrine
4个回答
24
投票

无法让

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

实际上,这就是

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

为什么不在实体管理器上调用

find()
?您是否知道,只要您通过 ID 查找,EM 就不会多次向数据库查询同一个对象? Doctrine 跟踪工作单元中已经水合的对象,并在后续 find() 调用中返回对现有对象的引用。
    


2
投票
getReference

来获取一个对象,然后调用它的方法(例如

getName
),那么 Doctrine 将从数据库中获取该实体。它没有其他方法可以找到该属性(getName)。


关于您的挑战:

EntityManager->contains($entity)

将是检查条令中的实体是否在实体管理器中的首选方法

    


0
投票

$classChild = $this->doctrine->getReference($classReference, $id); if (!$this->doctrine->contains($classChild)) { throw new \Exception("Invalid Reference"); }

其中 $this->doctrine 是你的 EntityManager


0
投票

$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);

© www.soinside.com 2019 - 2024. All rights reserved.