是否可以使用 Doctrine 的 MongoDB ODM 从延迟加载的对象中获取实际的 class 名称而不是代理 class 名称?
Is it possible to get the actual class name instead of the proxy class name from a lazy loaded object using Doctrine's MongoDB ODM?
在开始升级工作以将我的应用程序更新到 Symfony 3,并将几个库(包括 Doctrine)升级到更新版本之前,我能够将查询中的引用与早期查询的结果进行比较。我能够通过将先前查询结果中每个项目的派生 class 名称(例如 get_class($source)
)与新查询中数据库引用的 _doctrine_class_name
字段进行匹配来做到这一点.这将正确过滤掉类型不正确的文档。
自从升级我的依赖项后,当我得到源的派生 class 名称时,我得到的是一个代理而不是实际的 class 名称,例如MongoDBODMProxies\__CG__\AcmeBundle\Documents\MyClass
而不是 AcmeBundle\Documents\MyClass
.
在这种情况下,我要过滤的对象集合是Activity
个对象,它们的属性中有一个$source
属性,它是一个开放类型,也就是说它没有明确的鉴别器映射,因为我希望它能够容纳任何文档。我试图再次开始工作的是一个查询,它使用 ID 和 class 名称按匹配源过滤这些活动。查询代码如下所示:
public function findAllBySource($sources = array(), $date = null, $limit = 50)
{
$qb = $this->createQueryBuilder()->limit($limit)->sort('date', 'DESC');
if (!empty($date)) {
$qb->field('date')->lte($date);
}
$qb->addOr($qb->expr()->field('source')->exists(false));
foreach ($sources as $source) {
// $source is initialized as a proxy to the real class here
// using get_class($source) returns the class name to the
// proxy, not the actual FQCN, e.g. AcmeBundle\Document\MyClass
$expr = $qb->expr()
->field('source.$id')->equals(new \MongoId($source->getId()))
->field('source._doctrine_class_name')->equals(get_class($source));
$qb->addOr($expr);
}
$query = $qb->getQuery();
return array_values($query->execute()->toArray());
}
对于它的价值,我正在使用以下版本的学说和 MongoDB ODM/bundles:
- doctrine/mongodb^1.3.0
- doctrine/mongodb-odm^1.1.0
- doctrine/mongodb-odm-bundle^3.2.0
检查来自 ClassUtils class 的 getClass(Doctrine Common 的一部分):
<?php
// $source is an instance of MongoDBODMProxies\__CG__\AcmeBundle\Documents\MyClass
$source = Doctrine\Common\Util\ClassUtils::getClass($source);
echo $source; // $source should now be "AcmeBundle\Documents\MyClass"
在开始升级工作以将我的应用程序更新到 Symfony 3,并将几个库(包括 Doctrine)升级到更新版本之前,我能够将查询中的引用与早期查询的结果进行比较。我能够通过将先前查询结果中每个项目的派生 class 名称(例如 get_class($source)
)与新查询中数据库引用的 _doctrine_class_name
字段进行匹配来做到这一点.这将正确过滤掉类型不正确的文档。
自从升级我的依赖项后,当我得到源的派生 class 名称时,我得到的是一个代理而不是实际的 class 名称,例如MongoDBODMProxies\__CG__\AcmeBundle\Documents\MyClass
而不是 AcmeBundle\Documents\MyClass
.
在这种情况下,我要过滤的对象集合是Activity
个对象,它们的属性中有一个$source
属性,它是一个开放类型,也就是说它没有明确的鉴别器映射,因为我希望它能够容纳任何文档。我试图再次开始工作的是一个查询,它使用 ID 和 class 名称按匹配源过滤这些活动。查询代码如下所示:
public function findAllBySource($sources = array(), $date = null, $limit = 50)
{
$qb = $this->createQueryBuilder()->limit($limit)->sort('date', 'DESC');
if (!empty($date)) {
$qb->field('date')->lte($date);
}
$qb->addOr($qb->expr()->field('source')->exists(false));
foreach ($sources as $source) {
// $source is initialized as a proxy to the real class here
// using get_class($source) returns the class name to the
// proxy, not the actual FQCN, e.g. AcmeBundle\Document\MyClass
$expr = $qb->expr()
->field('source.$id')->equals(new \MongoId($source->getId()))
->field('source._doctrine_class_name')->equals(get_class($source));
$qb->addOr($expr);
}
$query = $qb->getQuery();
return array_values($query->execute()->toArray());
}
对于它的价值,我正在使用以下版本的学说和 MongoDB ODM/bundles:
- doctrine/mongodb^1.3.0
- doctrine/mongodb-odm^1.1.0
- doctrine/mongodb-odm-bundle^3.2.0
检查来自 ClassUtils class 的 getClass(Doctrine Common 的一部分):
<?php
// $source is an instance of MongoDBODMProxies\__CG__\AcmeBundle\Documents\MyClass
$source = Doctrine\Common\Util\ClassUtils::getClass($source);
echo $source; // $source should now be "AcmeBundle\Documents\MyClass"