Доктрина ситуации «один ко многим»: как легко получить связанные сущности

Для упрощения определены две сущности: Пользователь и Комментарий. Пользователь может публиковать много комментариев, и каждому комментарию назначается только один пользователь, поэтому объект «Комментарий» имеет:

/**
 * @var \Frontuser
 *
 * @ORM\ManyToOne(targetEntity="Frontuser")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="ownerUserID", referencedColumnName="id")
 * })
 */
private $owneruserid;

Однако в действии:

$orm = $this->getDoctrine()->getManager();
$repo = $orm->getRepository('CompDBBundle:Comment');
$repo->findBy(array('owneruserid' => $uid);

Произошла ошибка, что нет такого поля как owneruserid.

Как я могу получить все комментарии пользователя? То же самое происходит с подобными отношениями в моей БД - похоже, вы не можете запустить find() с внешними ключами в качестве параметров. Я считаю, что функция $user->getComments() должна автоматически генерироваться/распознаваться Doctrine, чтобы обеспечить эффективный и быстрый доступ к связанным сущностям.

Пример простой, но что, если есть еще объекты, связанные с моим пользователем таким же образом? Должен ли я объявлять репозитории для каждого и пытаться получить их по его owneruserid внешним ключам?


person user2311163    schedule 23.04.2013    source источник


Ответы (1)


Используя доктрину, когда вы определяете связанную сущность, ее типом является класс сущности (в данном случае FrontUser). Поэтому, во-первых, имя переменной связанного объекта вводит в заблуждение. Это должно быть, например.

private $ownerUser;

Затем, чтобы выполнить findBy в связанном поле объекта, вы должны предоставить экземпляр объекта, например.

$orm = $this->getDoctrine()->getManager();
$userRepo = $orm->getRepository('CompDBBundle:FrontUser');
$user = $userRepo->findById($uid);
$commentRepo = $orm->getRepository('CompDBBundle:Comment');
$userComments = $commentRepo->findByOwnerUser($user);

Если у вас нет или вы хотите получить объект пользователя, вы можете вместо этого использовать запрос DQL с «uid» в качестве параметра.

person redbirdo    schedule 24.04.2013
comment
Спасибо, ответ был полезен. Я также удалил идентификаторы из имен полей, чтобы соответствовать идее Доктрины. - person user2311163; 29.04.2013