Symfony - 如何使用查询构建器将数组作为参数传递?

3
我将要输出一个包含几个文档(称为放弃)的列表。然而,并不是每个用户都应该被允许查看所有文档,因此我已经实现了一个过滤器来检查用户是否分配了相同的“航空公司”和“市场”。所以每个用户只能看到分配给他的“航空公司”和“市场”的文档。 例如,这是用户实体航空公司属性的getter函数:
 /**
 * Get airlines
 *
 * @return array 
 */
public function getAirlines()
{
    if($this->airlines != null)
    {
        $airlines = explode(",", $this->airlines);
        return $airlines; 
    }

    return Array();        
}

这是控制器的逻辑:

        //Get User:
        $user = $this->container->get('security.context')->getToken()->getUser();

        // Gets an Array of User markets
        $user_markets = $user->getMarkets();

        // Gets an Array of User carriers
        $user_airlines = $user->getAirlines();


        if(!$this->ROLE_IS(Array( 'ROLE_XY'))){
            $query = $em->createQuery(
                'SELECT w
                FROM WaiverBundle:Waiver w
                WHERE w.carrier = :carrier 
                AND w.market = :market
                ORDER BY w.id DESC'
            )
               ->setFirstResult($page*10-10)
               ->setMaxResults(10)
               // I wan't to get the whole array and not just one position here:
               ->setParameters(array(':carrier'=>$user_airlines[0],
                ':market'=>$user_markets[0],
            ));  
        }else{
            $query = $em->createQuery(
                'SELECT u
                FROM WaiverBundle:Waiver u
                ORDER BY u.id DESC'
            )
               ->setFirstResult($page*10-10)
               ->setMaxResults(10);
        }

问题:我如何将DQL属性与数组进行比较,而不仅仅是一个字符串作为参数?

2个回答

4
我认为您想使用“IN”语法,而不是“=”语法:
'SELECT w
    FROM WaiverBundle:Waiver w
    WHERE w.carrier IN (:carrier)
    AND w.market = :market
    ORDER BY w.id DESC'

谢谢,我不知道这个问题存在一个特殊的参数(“IN”)。这似乎解决了我的问题。 - Mayak
太棒了,那么请点赞并接受我的答案吧;-) - Daniel

3

你的查询并不复杂。我认为在这种情况下,你应该考虑使用 QueryBuilder 而不是 DQL。类似以下代码就可以解决问题:

    $qb = $em->createQueryBuilder();
    $qb->select('w')
        ->from('WaiverBundle:Waiver', 'w')
        ->where($qb->expr()->in('w.carrier', ':carrier'))
        ->andWhere($qb->expr()->eq('w.market', ':market'))
        ->orderBy('w.id', 'DESC')
        ->setParameters(
            array(
                'carrier'=>$user_airlines[0],
                'market'=>$user_markets[0)
        );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接