2011-07-21 33 views
1

这是我的查询:学说2的QueryBuilder设置的参数不工作

公共职能getDetails($用户ID,$排序依据,$排序){

$query = $this->_em->createQueryBuilder() 
       ->select('u') 
       ->from('\Entities\Users', 'u') 
       ->where('u.userid= ?1') 
       ->orderBy('u.?3', '?3') 
       ->setParameter(1, $userid) 
       ->setParameter(2, $orderby) 
       ->setParameter(3, $sort) 
       ->getQuery() 
       ->getResult(); 

} 

它使示数:消息:语义错误]第0行,col 83'3 DESC'附近:错误:'?3'未定义。

如何从该函数中的属性获取orderby到查询?

回答

3

您不能使用占位符来构建DQL查询。你必须通过自己的代码是:

$sortBy = in_array($sortBy, array(...)) ? $sortBy : 'id'; 
$sortDir = $sortDir == 'ASC' ? 'ASC' : 'DESC'; 

$this->em->createQueryBuilder() 
    ... 
    ->orderBy('u.' . $sortBy, $sortDir) 
+2

主义有许多痛苦的缺点。它速度慢,复杂而且相当有限。很难看出这比直接的php/sql存储过程更好。 – Acyra

1

你不能绑定参数的QueryBuilder,只能查询,所以就换线,先把查询出建设者,然后填入参数,并得到结果。

$query = $this->_em->createQueryBuilder() 
      ->select('u') 
      ->from('\Entities\Users', 'u') 
      ->where('u.userid= ?1') 
      ->orderBy('u.?3', '?3') 
      ->orderBy('u.'.$orderBy, $sort) 
      ->getQuery() 
      ->setParameter(1, $userid) 
      ->getResult(); 

} 

在教义2.4中它是固定的,你可以将参数绑定到QueryBuilder。

更新:我错过了占位符在字段名称的时刻,SQL不支持这样的结构。

+0

这应该是被接受的答案。 – dualmon