Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create subquery using query builder

I try to convert SQL query (which works fine) in Doctrine query builder but I do not succeed because it contains a sub query

This is my SQL Query :

SELECT * 
FROM `navigation` 
WHERE `parent_id` = 
(
     SELECT `id` 
     FROM `navigation` 
     WHERE `parent_id` = 47 
     AND `nav_type`= 'nav'
     AND `published` = 1 
     AND `title` = 'Top'
)

And this is what I tried in my Repository :

class NavigationRepository extends EntityRepository
{
    public function test($parentId, $type, $status, $title)
    {
        $subQuery = $this->createQueryBuilder('n2')
            ->select('n2.id')
            ->where('n2.parent = :parent')
            ->andWhere('n2.type = :type')
            ->andWhere('n2.status = :status')
            ->andWhere('n2.title = :title')
            ->setParameter('parent', $parentId)
            ->setParameter('type', $type)
            ->setParameter('status', $status)
            ->setParameter('title', $title)
            ->getDQL();

        $qb = $this->createQueryBuilder('n');
        $qb
            ->where(
                $qb->expr()->eq('n.parent', '('.$subQuery.')')
            )
            ->getQuery()
            ->getResult();

        return $qb
            ->getQuery()
            ->getResult();
    }
}

But I got this error :

QueryException: Invalid parameter number: number of bound variables does not match number of tokens

Why ? It seems I have the right number of parameter yet...

like image 525
PASTAGA Avatar asked Dec 06 '25 21:12

PASTAGA


1 Answers

You should call setParameter() on $qb instead of $subQuery. The DQL doesn't contain interpolated parameters, it's just a regular string.

like image 154
martin Avatar answered Dec 08 '25 10:12

martin



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!