/** * {@inheritDoc} */ public function findTranslation(AbstractWrapper $wrapped, $locale, $field, $translationClass, $objectClass) { $em = $this->getObjectManager(); // first look in identityMap, will save one SELECT query foreach ($em->getUnitOfWork()->getIdentityMap() as $className => $objects) { if ($className === $translationClass) { foreach ($objects as $trans) { $isRequestedTranslation = !$trans instanceof Proxy && $trans->getLocale() === $locale && $trans->getField() === $field; if ($isRequestedTranslation) { if ($this->usesPersonalTranslation($translationClass)) { $isRequestedTranslation = $trans->getObject() === $wrapped->getObject(); } else { $isRequestedTranslation = $trans->getForeignKey() === $wrapped->getIdentifier() && $trans->getObjectClass() === $wrapped->getMetadata()->name; } } if ($isRequestedTranslation) { return $trans; } } } } $qb = $em->createQueryBuilder(); $qb->select('trans')->from($translationClass, 'trans')->where('trans.locale = :locale', 'trans.field = :field'); $qb->setParameters(compact('locale', 'field')); if ($this->usesPersonalTranslation($translationClass)) { $qb->andWhere('trans.object = :object'); $qb->setParameter('object', $wrapped->getObject()); } else { $qb->andWhere('trans.foreignKey = :objectId'); $qb->andWhere('trans.objectClass = :objectClass'); $qb->setParameter('objectId', $wrapped->getIdentifier()); $qb->setParameter('objectClass', $objectClass); } $q = $qb->getQuery(); $q->setMaxResults(1); $result = $q->getResult(); if ($result) { return array_shift($result); } return null; }