К сожалению, если вы хотите использовать ODM для запросов, вам нужно как-то сообщить ODM о вашем объекте. Хотя ваш registerManaged
будет работать при регистрации документа в UnitOfWork, у него есть недостаток, что любые ваши отношения могут быть разорваны и / или Doctrine будет считать их новыми во время сохранения / сброса. Вы можете попробовать что-то подобное:
$company = $this->fetchFromCache($params);
if ($dm->getUnitOfWork()->containsId($company->getId(), Company::class)) {
return $dm->find(Company::class, $company->getId());
}
return $dm->merge($company);
Как отмечалось ранее, merge
будет рекурсивно объединять ваши документы и встроенные в них документы / отношения и помечать их как управляемые ODM, точно так же, как они будут только получены. Обратите внимание, что слияние будет соответствовать вашим каскадным настройкам для справок. Более подробную информацию о слиянии можно найти в документации . Также помните, что объединяемые документы могут влиять на уже извлеченные документы и обновлять их поля тем, что объединяется.
Merge
операция будет выполнена только один раз, как раз перед тем, как мы проверяем, управляет ли ODM компанией, идентифицированной по идентификатору, выбранному из кэша. Если это произойдет, мы вызываем $dm->find()
, который не попадет в базу данных, так как сначала он найдет карту объектов в памяти и вернет вам уже управляемый экземпляр. Таким образом, вы всегда получите документ, управляемый ODM, избегая запроса к базе данных.