如何从dql中的innerJoined实体中查找arraycollection中的项?

时间:2013-08-09 16:14:18

标签: php symfony dql

我想从用户中选择访问权限。访问应该包含我传递给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'

我该怎么做?

谢谢。

2 个答案:

答案 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();
}