doctrine 2 querybuilder,设置参数不起作用

时间:2011-07-21 12:03:48

标签: doctrine doctrine-orm query-builder

这是我的疑问:

公共函数getDetails($ userid,$ orderby,$ sort){

$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行,第83行附近'?3 DESC':错误:'?3'未定义。

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

2 个答案:

答案 0 :(得分:3)

您不能使用占位符来进行DQL查询的动态构建。你必须自己编写代码:

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

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

答案 1 :(得分:1)

你不能将参数绑定到QueryBuilder,只能绑定到Query,所以只需交换行,首先从构建器中获取查询,然后用参数填充它并获得结果。

$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();

}

在doctrine 2.4中修复了它,你可以将参数绑定到QueryBuilder。

更新:我错过了在字段名称中使用占位符的时刻,SQL不支持此类构造。