Можно ли получить фактическое имя класса вместо имени прокси-класса из лениво загруженного объекта с помощью ODM MongoDBPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Можно ли получить фактическое имя класса вместо имени прокси-класса из лениво загруженного объекта с помощью ODM MongoDB

Сообщение Anonymous »

Прежде чем начать работу по обновлению моего приложения до Symfony 3 и одновременно обновить несколько библиотек (включая Doctrine) до более поздних версий, я смог сравнить ссылки в запросе с результатами более раннего запроса. Мне удалось это сделать, сопоставив имя производного класса (например, get_class($source)) каждого элемента в результатах предыдущего запроса с полем _doctrine_class_name в ссылке на базу данных в новом запросе. Это позволит правильно отфильтровать документы неправильного типа.

После обновления моих зависимостей, когда я получаю имя производного класса источника, я получаю обратно прокси-сервер вместо фактического имени класса, например. MongoDBODMProxies\\__CG__\\AcmeBundle\\Documents\\MyClass вместо AcmeBundle\Documents\MyClass.

Коллекция объектов, которые я пытаюсь фильтровать в этом случае, - это объекты Activity, среди их свойств есть свойство $source, которое является открытым типом, то есть для него нет явной карты дискриминатора, как я хотел он потенциально сможет хранить любой документ. Я снова пытаюсь заставить работать запрос, который фильтрует эти действия по соответствующим источникам, используя идентификатор и имя класса. Код запроса выглядит следующим образом:

Код: Выделить всё

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());
}
Я использую следующие версии ODM/пакетов Doctrine и MongoDB:
  • doctrine/mongodb ^1.3.0
  • doctrine/mongodb-odm ^1.1.0
  • doctrine/mongodb-odm-bundle ^3.2.0


Подробнее здесь: https://stackoverflow.com/questions/384 ... -name-from
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»