David Zadražil
David Zadražil

Reputation: 97

Doctrine Query Builder - Search in collection

I'm trying to create fulltext search in Doctrine Query Builder. But I have here one problem.

In Post Entity I have this:

    /**
     * @ORM\Column(type="string")
     */
    protected $title;

    /**
     * @ORM\ManyToMany(targetEntity="Tag", inversedBy="posts")
     * @ORM\JoinTable(
     *     name="posts_tags",
     *     joinColumns={
     *         @ORM\JoinColumn(name="post_id", referencedColumnName="id")
     *     },
     *     inverseJoinColumns={
     *         @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
     *     }
     * )
     */
    protected $tags;

And I'm searching in post with this code:

$searched = $this->em->createQueryBuilder();

$searched->select('p')
         ->from(Post::getClassName(), 'p');

$searched->where(
               $searched->expr()->like('p.title', $searched->expr()->literal('%' . $values->search . '%'))
            );

But now I don't know how to search in "tags" because it's collection. Can somebody put me on right journey? Thank you very much.

Upvotes: 1

Views: 2656

Answers (1)

lxg
lxg

Reputation: 13127

Try an inner join:

$qb = $em->createQueryBuilder();
$posts = $qb->select('p')
    ->from(Post::getClassName(), 'p')
    ->innerJoin('p.tags', 't')
    ->where($qb->expr()->like('p.title', ':postTitle'))
    ->andWhere('t.name = :tagName')
    ->setParameter("postTitle", "%{$values->search}%")
    ->setParameter("tagName", "foobar")
    ->getQuery()->getResult();

Some variable names are made up, as I don't know your exact schema, but this should get you going.

Upvotes: 2

Related Questions