0

我想选择访问表单用户。访问应包含在我传递给 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 'Employee' AND ...等。这些名称是动态的,数组可以是任意长度

't' 有一个属性名称并且是来自 'v'的数组集合
'v' 是一个数组集合形式 'u'

我该怎么做呢?

谢谢你。

4

2 回答 2

0

您应该使用一个WHERE IN语句,将名称数组作为参数传递。

$qb->add('where', $qb->expr()->in('t.name', array('VIP', 'Employee', '...')));
于 2013-08-09T17:32:31.990 回答
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();
}
于 2013-08-10T15:35:54.240 回答