在 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 是我想要的正确数据,即请求的列及其内容。感谢大家的投入。非常感激。 :)
我收到此异常:
[语义错误] 第 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 是我想要的正确数据,即请求的列及其内容。感谢大家的投入。非常感激。 :)