2013-08-09 2 views
0

Я хочу выбрать посещений пользователей. Посещения должны содержать имена тегов, которые происходят в массиве, который я передаю в dql.Как искать элементы в arraycollection от innerJoined entity в dql?

До сих пор это то, что у меня есть:

// select the user database 
    $qb = $this->getEntityManager()->createQueryBuilder(); 
    $qb 
     ->select('u') 
     ->from('MyBundle:User', 'u'); 
     ->innerJoin('u.visits', 'v'); 
     ->innerJoin('v.tags', 't'); 

Теперь я хочу, чтобы искать визитов, которые имеют метки («т») с именами, то есть «VIP» И «Employee» И. .. и т. д. Эти имена являются динамическими, массив может быть любой длины.

«т» имеет имя свойства и является ArrayCollection от «V»
«V» является форма ArrayCollection «и»

Как мне это сделать?

спасибо.

ответ

0

Вы должны использовать оператор WHERE IN, передавая в качестве параметра массив имен.

$qb->add('where', $qb->expr()->in('t.name', array('VIP', 'Employee', '...'))); 
+0

это близко, но не совсем еще решение. Это проверит, существует ли одно из имен тегов в массиве. Предположим, что у меня есть визит с тегом «VIP» и тегом «Сотрудник», вышеприведенный оператор находит его более чем достаточно, если в массиве встречается один из тегов, в то время как он строго должен искать посещения, у которых есть теги (или более) назначенный ему. – apfz

0

я решил через рекурсию

$qb = $this->getEntityManager()->createQueryBuilder(); 
    $qb 
     ->select('u') 
     ->from('MyBundle:User', 'u'); 
    $qb ->innerJoin('u.visits', 'v'); 
    $qb->andWhere($qb->expr()->in('v.id', $this->getVisitDQL($qb, $visitData, $tagCounter))); 


public function getVisitDQL(QueryBuilder $qb, $data, $counter) { 

    $tag = $data['tags'][$counter]; 
    $tagName = $tag['content']; 

    $qb2 = $this->getEntityManager()->createQueryBuilder(); 

    $qb2 
     ->select('v'.$counter.'.id') 
     ->from('MyBundle:Visit', 'v'.$counter) 
     ->innerJoin('v'.$counter.'.tags', 'vt'.$counter) 
     ->where($qb2->expr()->eq('vt'.$counter.'.name',':vtag_'.$counter)); 

    $qb->setParameter(':vtag_'.$counter, $tagName); 

    // if were not processing the last filter, continue recursion 
    if ($counter != (count($data['tags'])-1)) { 
     $qb2->andWhere($qb->expr()->in('v'.$counter.'.id', $this->getVisitDQL($qb, $data, $counter + 1))); 
    } 

    return $qb2->getDQL(); 
}