Доктрина symfony2 findBy id в arrayCollection

Использование Symfony2.3.4 и Doctrine.

У меня есть класс Student с отношением ManyToMany к классу Edition.

Теперь в моем StudentController у меня есть это IndexAction ($ edition_id), чтобы перечислить не всех студентов в БД, а только тех, которые связаны с данным идентификатором Edition.

$entities = $em->getRepository('PersonBundle:Student')->findBy(array(
    ????????
));

Я думаю о каких-то критериях для использования с $edition_id, но не могу их придумать.

Советы приветствуются, спасибо.

@dmnptr: я пытаюсь это сделать, я новичок в этом, так что скажите мне, если я сделал что-то не так.

Я поместил эту функцию, которую вы написали, в контроллер, и в методе IndexAction ($ edition) я добавил

$students = this->findAllByEdition($edition);

теперь проблема в том, что параметр $edition исходит из шаблона ветки, например:

<a href="{{ path('student', { 'edition': entity}) }}"</a>

будучи сущностью, которая владеет объектом Edition.

Но когда я делаю это так, этот сущность возвращает метод __toString(), что означает строку с названием издания, а не само издание, которое использует функция, которую вы мне дали.

Теперь, вы случайно не знаете способ получить сам объект из шаблона, а не метод __toString(), спасибо...


person jmiguel    schedule 28.03.2014    source источник
comment
Вы не можете втиснуть весь объект в URL. Вы должны использовать entity.id в path(), а затем в своем контроллере получить нужную сущность, используя ее идентификатор. Кроме того, findAllByEdition должен находиться в пользовательском репозитории, а не в контроллере.   -  person dmnptr    schedule 29.03.2014
comment
вот я и подумал, только не знаю как вызвать метод, если его нет в контроллере, не подскажете? А также, и это просто для уверенности, какой риск оставить его в контроллере??   -  person jmiguel    schedule 29.03.2014
comment
Я не думаю, что существует риск, связанный с наличием этого метода в контроллере. Вы можете это сделать, это ваш выбор. Однако это считается плохим стилем, поскольку добавляет код, который логически принадлежит репозиторию, к вашему контроллеру, делая его излишне большим. Подробнее о пользовательском репозитории: symfony.com/doc/current /книга/   -  person dmnptr    schedule 31.03.2014


Ответы (1)


Вы должны использовать пользовательский метод репозитория. Передайте $edition в качестве параметра, а не только идентификатор. Что-то вроде этого:

public function findAllByEdition($edition)
{
    $em = $this->getEntityManager();

    $queryText  = "SELECT s FROM PersonBundle:Student s ";
    $queryText .= "WHERE :edition MEMBER OF s.editions";

    $query = $em->createQuery($queryText);
    $query->setParameter('edition', $edition)

    return $query->getResult();
}
person dmnptr    schedule 28.03.2014
comment
работает просто отлично, по крайней мере, в моем случае, он работает с идентификатором сущности, а не с самим объектом сущности, что означает: findAllByEdition($edition_id) в порядке. - person jmiguel; 29.03.2014
comment
Еще лучше - меньше запросов к базе данных :-) - person dmnptr; 31.03.2014