2014-03-28 3 views
1

Symfony2.3.4와 Doctrine을 사용합니다.symfony2 doctrine arrayCollection의 findBy ID

클래스 Edition의 ManyToMany 관계가있는 클래스 Student가 있습니다.

내 StudentController에서 DB에있는 모든 학생이 아니라 해당 Edition ID와 관련된 학생을 나열하는 IndexAction ($ edition_id)이 있습니다.

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

나는 $ edition_id와 (과) 함께 사용할 어떤 기준을 생각하고 있지만 어떤 것도 생각 해낼 수 없습니다.

감사의 말씀 감사합니다.

@dmnptr : 나는 그것을 시도하고 있는데, 나는 이것에 아주 익숙하다. 그래서 내가 잘못한 것을 말해 준다.

:

난 당신이 컨트롤러와 메소드 IndexAction ($ 에디션) 지금

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

문제입니다 매개 변수 $ 에디션이 같은 나뭇 가지 템플릿에서오고있다

을 추가로 썼다 그 기능을 넣어
<a href="{{ path('student', { 'edition': entity}) }}"</a> 

엔티티 에디션 개체를 보유하고 있습니다.

엔티티은 __toString() 메서드를 반환합니다. 즉, 사용자가 제공 한 함수가 사용하는 에디션 자체가 아닌 에디션 이름의 문자열을 반환합니다.

지금, 당신은 템플릿에서 객체 자체를 얻을 수있는 방법을 아시나요 아닌 __toString() 메소드, 덕분에 ...

+0

전체 개체를 URL로 압축 할 수 없습니다. 'path()'에서'entity.id'를 사용해야하고, 컨트롤러에서 ID를 사용하여 필요한 엔티티를 얻으십시오. 또한,'findAllByEdition'은 컨트롤러가 아닌 커스텀 저장소에 있어야합니다. – dmnptr

+0

그게 내가 생각한 것인데, 컨트롤러에없는 경우 메서드를 호출하는 방법 만 알지 못한다. 내게 말해 줄 수 있니? 또한 컨트롤러에 남겨 둘 위험은 무엇입니까? – jmiguel

+0

컨트롤러에이 방법을 사용하는 것과 관련된 위험이 있다고 생각하지 않습니다. 당신은 그것을 할 수 있습니다, 그것은 당신의 선택입니다. 그러나 이것은 논리적으로 컨트롤러에 속한 코드를 컨트롤러에 추가하여 불필요하게 커지게하므로 나쁜 스타일로 간주됩니다. 여기에 사용자 정의 저장소에 대한 자세한 내용입니다 : http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes – dmnptr

답변

4

는 사용자 정의 저장소 방법을 사용해야합니다. id가 아니라 $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(); 
} 
+0

내 질문을 편집했습니다 ... – jmiguel

+0

잘 작동합니다, 적어도 내 경우에는, 그것 엔티티 객체 자체가 아닌 엔티티 ID로 작동합니다. 즉, findAllByEdition ($ edition_id)은 ok입니다. – jmiguel

+0

더 나은 데이터베이스 쿼리가 적습니다. :-) – dmnptr