Я использовал такой же тип в хранилище.
Я создал методы в классе репозитория, которые добавили части QueryBuilder в запрос.
Например, на основании вашего:
namespace App\Repository;
class BooksRepository extends EntityRepository
{
private function whereAuthorIsAlive($qb)
{
$qb->where('a.dod is null');
return $qb;
}
private function whereAuthorName($qb, $name)
{
$qb->where('a.name = :name')
->setParameter('name', $name);
return $qb;
}
public function getBooksByAliveAuthorName($name)
{
$qb = $this->createQueryBuilder('b')
->join('b.author', 'a')
$qb = $this->whereAuthorIsAlive($qb);
$qb = $this->whereAuthorName($qb, $name);
return $qb->getQuery()->getResult();
}
}
Чтобы зарегистрировать этот репозиторий в вашей организации:
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\BooksRepository")
*/
class Books
{
// your entity
}
А затем в контроллере:
$books = $this->getDoctrine()
->getRepository('App:Books')
->getBooksByAliveAuthorName('Mozart');