我正在研究博客项目,其中有很多来自不同作者的帖子,我想创建一个简单的过滤器,只返回给定作者的帖子:
这是我的控制器,它从用户那里获取数据:
/**
* @Route("/author/{author}", name="post_author")
* @Template()
*/
public function findByAuthorAction($author)
{
$criteria = /*this is what i need*/
$posts=$this->get('cvut_fit_biwt1_blog')->findPostBy($criteria);
return array(
'posts'=>$posts
);
}
这就是findPostBy的样子:
public function findPostBy(array $criteria)
{
return $this->postRepository->findBy($criteria);
}
最后在Doctrine EntityRepository中实现findBy:
public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
{
$persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName);
return $persister->loadAll($criteria, $orderBy, $limit, $offset);
}
你能告诉我如何在我的控制器中构建条件数组,以便过滤我的帖子(如果可能的话)?
答案 0 :(得分:3)
假设{author}
参数是作者的URI名称或其他内容(这纯粹是推测性的),您必须从中获取author
对象或author
ID主义第一:
$authorObj = $this->getDoctrine()->getManager()
->getRepository('AcmeBundle:Author')->findOneByName(urldecode($author));
然后使用关联数组将ID或Author对象传递到条件中:
$criteria = array('author' => $authorObj);
如果$author
实际上是作者的ID,那么您可以这样做:
$criteria = array('author' => $author);
请注意,即使您只获得一个结果,也会获得一个对象集合。您应该使用findOneBy
:
public function findPostBy(array $criteria)
{
return $this->postRepository->findOneBy($criteria);
}