У меня есть класс компании, ссылающиеся пользователи:Получить массив ссылочных идентификаторов в Doctrine ODM
/**
* @MongoDB\Document()
*/
class Company {
/* ... */
/**
* @MongoDB\ReferenceMany(targetDocument="Topboard\UserBundle\Document\User", inversedBy="companies")
*/
protected $users;
}
В моем контроллере мне нужно проверить, если ссылка на пользователь существует в компании и сохранить ссылку на этот пользователь, а не другие ссылки. Я также хочу избежать нескольких запросов БД для пользователей. Я просто хочу проверить, соответствует ли идентификатор ссылок $currentUserId
.
public function getCompanyAction($companyId, $currentUserId) {
$dm = $this->get('doctrine_mongodb')->getManager();
$company = $dm->getRepository('TopboardAppBundle:Company')->findOneById($companyId);
foreach ($company->getUsers() as $user) {
// Foreach will query each user separetly. This is not what I need.
// I need somehow access array of references' ids
// and compare them with the $currentUserId
if($user->getId() !== $currentUserId){
// Remove reference
}
}
return $company;
}
Прокси звучит о праве. Итак, вы предлагаете изменить идентификатор getter в классе User? Я думаю, проблема заключается в том, что когда я делаю 'foreach', он уже запускает запрос БД. – Websirnik
Нет, ваш получатель должен оставаться неповрежденным, вы можете проверить autogenerated Proxy class (они обычно находятся в 'app/cache/lcl/doctrine/odm/mongodb/Proxies /'). Что касается 'foreach', он не должен инициировать запрос сам по себе, так как ваша ссылка - это собственная сторона, которая уже доступна в документе после начальной выборки. – malarzm
Что я имею в виду, ваш код выглядит корректно и не должен запускать никаких дополнительных запросов в этот момент – malarzm