2017-05-28 109 views
1

我正在此异常DQL查询使用变量:在Select语句返回异常

[语义错误] 0行,列124“附近柱=:列”:错误:“列”没有定义。

当尝试运行这段代码:

/** 
* @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); 

这DQL查询时, 'g.column' 被 'bench_press_1_weight' 取代运行良好,但当g.column被放置在那里时会出错。我认为'bench_press_1_weight'应该被传递,因为我在参数'column'=> $ column中设置。对我而言,这应该起作用。我还没有找到Doctrine docs有任何用处,并尝试了无数的组合。

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

任何人都有任何线索?提前致谢!

+1

所以你实际上有一个名为列的数据库表列?列是MySQL中的保留字,因此不会很好结束。 – Cerad

+0

其实我没有列名列,如果你看代码,你会看到它是变量名。这是DQL,而不是SQL,所以我在那里安全。为了安全起见,我使用另一个变量名称对它进行了测试,它没有任何区别,同样的确切错误消息。 –

+0

DQL转换为SQL,因此适用相同的限制。 'column =:column'强烈暗示了一个名为column的列,就像错误消息一样。你是否试图动态指定实际列?我想我只是不了解设计。 dump($ qb-> getQuery() - > getSQL()会显示生成的sql。 – Cerad

回答

0

我已经解决了这个问题,它非常简单,我差点射击自己。那么,什么发生需要的是去除从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; 
} 

这将返回正确的数据我之后,也就是列要求和它的内容。感谢大家的意见。非常感激。 :)

0

试图改变这种

->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, 
    )) 
+0

我已经这样做了,并没有改变任何东西。感谢您的输入。 –

0

试图改变这种

->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') 
+0

我按照你的建议得到这个结果:[Semantical Error] line 0,col 142 near'column =:column ORDER':Error:Class AppBundle \ Entity \ ExerciseStats has no field or association named column –