最初我正在使用此
$entities = $em->getRepository('AcmePanduBundle:Checklist')->findAll();
现在我希望如果存在pid
变量,那么它应该使用
$entities = $em->getRepository('AcmePanduBundle:Checklist')->findAll('where pid=1')
如果它不存在则findAll应该有效。
我可以在控制器中执行此操作,还是必须在存储库类中创建自定义函数?
答案 0 :(得分: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,annotations),但是这里的文档是:http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes
一旦完成,任何调用$em->getRepository('AcmePanduBundle:Checklist')->findAllWithOptionalPid($pid);
的控制器都会按预期工作,无论是否有$ pid变量。
答案 1 :(得分:0)
使用像{findByPid
这样的findBy or dynamic methods$repository = $em->getRepository('AcmePanduBundle:Checklist');
if ($pid) {
$entities = $repository->findBy(array('pid' => $pid));
// or: $entities = $repository->findByPid($pid);
} else {
$entities = $repository->findAll();
}