2014-03-28 31 views
1

使用Symfony2.3.​​4和Doctrine。symfony2学说findBy id arrayCollection

我有一个类的学生与一个类版本ManyToMany关系。

现在在我的StudentController中,我有这个IndexAction($ edition_id)来列出数据库中的所有学生,但只列出与给定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

你应该使用自定义库的方法。通过$edition作为参数,而不仅仅是一个id。类似这样的:

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)是可以的。 – jmiguel

+0

更好 - 少数据库查询:-) – dmnptr