学说实体管理器的getReference()(getReference() of doctrine

2019-09-02 08:09发布

情况:

我想使用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)

我怎样才能得到一个对象,甚至不存在于数据库中的代理? 如果我评论这一行 ,EntityManager的不管理的对象,我得到的输出abab ,这对我做,因为我不希望得到的是不存在于数据库中的代理对象更有意义。 对于信息,对象返回的代理具有其所有属性null 。 因此,我得到一个对象不存在于数据库中的代理。 所以,如果我问这个对象,我收到了“未找到实体”的异常。

我们面临的挑战

任何人都可以做的这个任何意义? 是否有依赖的方式getReference()告诉我们这是否真的对象在数据库中确实存在?

Answer 1:

有没有办法让getReference()检查数据库的引用对象的存在。

其实,这是getReference()并通过其返回的代理是一回事:创建占位符对象(代理)没有去到数据库中。 你很少会想这样做明确。 保湿实体创建延迟加载占位符基于外键值相关实体时,通常主义做到这一点内部。

你为什么不只是调用find()在实体管理器? 你知道,EM 不会查询数据库不止一次相同的对象,只要你看看它的ID? 学说跟踪已水合物体在单位工作,并返回到在随后的现有对象的引用find()调用。



Answer 2:

如果您使用getReference获取对象,但随后在其上调用的方法如getName然后学说将获取从数据库中的实体。 它有没有其他办法来找出财产(的getName)。


关于你的挑战:

EntityManager->contains($entity)将检查是否从学说的实体是在实体管理的首选方式



Answer 3:

你需要得到引用,并检查是否在数据库中包含:

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

其中$这个 - >教义是您的EntityManager



文章来源: getReference() of doctrine Entity Manager