我想从用户中选择访问权限。访问应该包含我传递给dql的数组中出现的标记名称。
直到现在这就是我所拥有的:
// select the user database
$qb = $this->getEntityManager()->createQueryBuilder();
$qb
->select('u')
->from('MyBundle:User', 'u');
->innerJoin('u.visits', 'v');
->innerJoin('v.tags', 't');
现在,我想查找带有标记(' t')的访问,其中包含“' VIP' AND '员工' AND ...等。这些名称是动态的,数组可以是任意长度。
'吨'有一个属性名称,是来自' v'的数组收集。
' V'是一个数组收集形式' u'
我该怎么做?
谢谢。
答案 0 :(得分:0)
您应该使用WHERE IN
语句,将名称数组作为参数传递。
$qb->add('where', $qb->expr()->in('t.name', array('VIP', 'Employee', '...')));
答案 1 :(得分: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();
}