在 Select 语句中使用变量的 DQL 查询返回异常

DQL Query Using Variable in Select Statement Returning Exception

我收到此异常:

[语义错误] 第 0 行,'column = :column' 附近的第 124 列:错误:'column' 未定义。

尝试运行此代码时:

/**
 * @param User $user
 * @param String $column
 * @return array
 */
public function getStatsByDQL(User $user, String $column)
{
    $midNight = date_create('00:00:00')->format('Y-m-d H:i:s');

    $em2 = $this->getDoctrine()->getManager()->getRepository('AppBundle:ExerciseStats')
        ->createQueryBuilder('g')
        ->setParameters(array(
            'user' => $user, 'column' => $column, 'date' => $midNight,
        ))
        ->where('user = :user', 'g.timestamp < :date',  'column = 
:column')
        ->select('g.column')
        ->setMaxResults(1)
        ->join('g.user', 'user')
        ->orderBy('g.column','DESC')

        ->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
        return $em2;

这是它的执行方式:

$yy = $this->getStatsByDQL($usr, 'bench_press_1_weight');
    var_dump($yy);

当 'g.column' 被 'bench_press_1_weight' 替换时,此 DQL 查询 运行 没问题,但当 g.column 放在那里时就会出错。我 认为 'bench_press_1_weight' 应该被传递,因为我设置了参数 'column' => $column。对我来说,这应该有效。我没有发现 Doctrine 文档有任何用处,并且尝试了无数种组合。

此功能在我的默认控制器中。

有人有线索吗?提前致谢!

尝试改变这个

    ->setParameters(array(
        'user' => $user, 'column' => $column, 'date' => $midNight,
    ))
    ->where('user = :user', 'g.timestamp < :date',  'column = :column')

    ->where('user = :user', 'g.timestamp < :date',  'column = :column')
    ->setParameters(array(
        'user' => $user, 'column' => $column, 'date' => $midNight,
    ))

尝试改变这个

->setParameters(array(
    'user' => $user, 'column' => $column, 'date' => $midNight,
))
->where('user = :user', 'g.timestamp < :date',  'column = :column')

有了这个

尝试改变这个

->setParameters(array(
    'user' => $user, 'column' => $column, 'date' => $midNight,
))
->where('g.user = :user', 'g.timestamp < :date',  'g.column = :column')

我已经解决了这个问题,太简单了,我差点自杀了。所以需要做的是从 params 和 WHERE 语句中删除函数签名中引入的变量,它看起来像这样:

public function getStatsByDQL(User $user,  String $col)
{

    $midNight = date_create('00:00:00')->format('Y-m-d H:i:s');
    $parameters = (array('user' => $user, 'date' => $midNight, 

    ));
    $em2 = $this->getDoctrine()->getManager()->getRepository('AppBundle:ExerciseStats')
        ->createQueryBuilder('g')
        ->setParameters($parameters)
        ->where('g.user = :user', 'g.timestamp < :date')
        ->select('g.'. $col)
        ->setMaxResults(1)
        ->join('g.user', 'user')
        ->orderBy( 'g.'. $col,'DESC')
        ->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
    return $em2;
}

这 returns 是我想要的正确数据,即请求的列及其内容。感谢大家的投入。非常感激。 :)