doctrine Entity Manager的getReference()

Mic*_*ick 10 doctrine symfony doctrine-orm

情况:

我想使用doctrine2 Entity Manager 的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);
Run Code Online (Sandbox Code Playgroud)

输出:

a
b
a
object(Proxies\__CG__\Acme\ArticleBundle\Entity\Article)
Run Code Online (Sandbox Code Playgroud)

如何获取数据库中甚至不存在的对象的代理?如果我评论这一行,实体管理器不管理对象,我获得输出abab,这对我来说更有意义,因为我不想获得数据库中不存在的代理对象.对于info,返回的代理对象具有其所有属性null.因此,我获得了数据库中不存在的对象的代理.所以,如果我要求这个对象,我会得到一个"未找到实体"异常.

挑战

任何人都可以对此有任何意义吗?有没有办法依靠getReference()告诉我们这个对象是否确实存在于数据库中?

小智 21

没有办法getReference()检查数据库是否存在引用的对象.

实际上,这就是getReference()它返回的代理所有内容:创建占位符对象(代理)而无需转到数据库.你很少想明确地这样做.通常,Doctrine在为实体提供保湿功能时会在内部执行此操作,以根据外键值为相关实体创建延迟加载占位符.

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

  • 实际上,如果您使用继承映射并请求父类的引用(即,具有也在您的鉴别器映射中的子类的类),Doctrine会立即获取您正在引用的对象([请参阅EntityManager :: getReference(): 459](https://github.com/doctrine/doctrine2/blob/2.4/lib/Doctrine/ORM/EntityManager.php#L459)).它需要这样做才能知道实体的类(因为你只给它一个超类).所以在这种情况下你要么从``getReference()`返回一个对象,如果它存在,或者你得到``null``如果不存在. (2认同)