0

最初我正在使用这个

$entities = $em->getRepository('AcmePanduBundle:Checklist')->findAll();

现在我希望如果pid变量存在,那么它应该用一些东西过滤查询

$entities = $em->getRepository('AcmePanduBundle:Checklist')->findAll('where pid=1')

如果它不存在,那么 findAll 应该可以工作。

我可以在控制器中执行此操作,还是必须在存储库类中创建自定义函数?

4

2 回答 2

1

当然,您可以在控制器中执行此操作:

$entities = (isset($pid))
    ? $em->getRepository('AcmePanduBundle:Checklist')->findByPid($pid)
    : $em->getRepository('AcmePanduBundle:Checklist')->findAll();

但是,这是自定义存储库的用途。如果您计划在多个地方复制此逻辑,我肯定会创建一个。

它看起来像:

// src/Acme/PanduBundle/Repository/ChecklistRepository.php
namespace Acme\PanduBundle\Repository;

use Doctrine\ORM\EntityRepository;

class ChecklistRepository extends EntityRepository
{
    public function findAllWithOptionalPid($pid = null)
    {
        if($pid)
            return $this->findByPid($pid);
        return $this->findAll();
    }
}

...并且不要忘记在您的 Doctrine 配置中引用此存储库。不知道您使用什么方法进行配置(xml、yml、注释),但这里的文档:http ://symfony.com/doc/current/book/doctrine.html#custom-repository-classes

一旦完成,任何控制器调用$em->getRepository('AcmePanduBundle:Checklist')->findAllWithOptionalPid($pid);都将按照您的预期工作,无论是否使用 $pid 变量。

于 2012-08-15T07:44:03.987 回答
0

使用findBy 或动态方法,如“findByPid”

$repository = $em->getRepository('AcmePanduBundle:Checklist');
if ($pid) {
    $entities = $repository->findBy(array('pid' => $pid));
    // or: $entities = $repository->findByPid($pid);
} else {
    $entities = $repository->findAll();
}
于 2012-08-15T07:43:57.133 回答