我想使用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);
a
b
a
object(Proxies\__CG__\Acme\ArticleBundle\Entity\Article)
如何获取数据库中甚至不存在的对象的代理?如果我评论this line,则entityManager不管理对象,我获得输出abab
,这对我来说更有意义,因为我不想获得一个不存在的代理对象数据库。有关信息,返回的代理对象具有其所有属性null
。因此,我获得了数据库中不存在的对象的代理。所以,如果我要求这个对象,我会得到一个“未找到实体”的例外。
任何人都可以对此有所了解吗?有没有办法依靠getReference()
告诉我们这个对象是否确实存在于数据库中?
答案 0 :(得分:20)
无法使getReference()
检查数据库是否存在引用的对象。
实际上,这就是getReference()
及其返回的代理的全部内容:创建占位符对象(代理)而无需转到数据库。你很少想明确地这样做。通常,Doctrine在为实体添加水分时会在内部执行此操作,以根据外键值为相关实体创建延迟加载占位符。
为什么不在实体经理上拨打find()
?您是否知道,只要您通过ID查找,EM将不多次查询同一个对象的数据库? Doctrine在工作单元中跟踪已经水合的对象,并在后续find()
次调用中返回对现有对象的引用。
答案 1 :(得分:2)
如果使用fit f(x) '< cat file1.csv file2.csv file3.csv file4.csv file5.csv' u 3:43:0 a,b
来获取对象,然后在其上调用方法,例如getReference
,则Doctrine将从数据库中获取实体。没有其他方法可以找到属性(getName)。
关于您的挑战:
getName
将是检查来自学说的实体是否在实体管理器中的首选方法
答案 2 :(得分:0)
您需要获取参考并检查数据库中是否包含
$classChild = $this->doctrine->getReference($classReference, $id);
if (!$this->doctrine->contains($classChild)) {
throw new \Exception("Invalid Reference");
}
其中$ this-> doctrine是您的EntityManager