Pastx
Pastx

Reputation: 767

Using doctrine findBy method

I am working on blog project where is lots of posts from different authors and i want to create a simple filter that would return me only posts by given author:

This is my controller that takes data from user:

    /**
     * @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
    );
}

This is how findPostBy looks like:

public function findPostBy(array $criteria)
    {
        return $this->postRepository->findBy($criteria);
    }

And finally implementation of findBy in Doctrine EntityRepository:

 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);
    }

Can you tell me how to build criteria array in my contoller so it would filter my posts (if it is even possible) ?

Upvotes: 1

Views: 2197

Answers (1)

sjagr
sjagr

Reputation: 16512

Assuming the {author} parameter is the author's URI name or something (this is purely speculative), you have to fetch either the author object or the author ID from Doctrine first:

$authorObj = $this->getDoctrine()->getManager()
    ->getRepository('AcmeBundle:Author')->findOneByName(urldecode($author));

Then pass the ID or Author object into the criteria using an associative array:

$criteria = array('author' => $authorObj);

If $author is in fact the ID of the author, then you can just do:

$criteria = array('author' => $author);

Note that you will get a Collection of objects even if you just get one result. You should use findOneBy:

public function findPostBy(array $criteria)
{
    return $this->postRepository->findOneBy($criteria);
}

Upvotes: 3

Related Questions