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

Symfony 在返回异常的Select语句中使用变量的DQL查询,symfony,doctrine,dql,Symfony,Doctrine,Dql,我得到一个例外: [语义错误]第0行第124列“column=:column”附近:未定义错误:“column” 尝试运行此代码时: /** * @param User $user * @param String $column * @return array */ public function getStatsByDQL(User $user, String $column) { $midNight = date_create('00:00:00')->format('

我得到一个例外:

[语义错误]第0行第124列“column=:column”附近:未定义错误:“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;
当“g.column”替换为“bench\u press\u 1\u weight”时,此DQL查询运行良好,但当g.column放置在那里时,此查询会出错。我认为应该传递“台架压重”,因为我在参数“列”=>$column中设置了参数。对我来说,这应该行得通。我没有发现教义文件有任何用处,并尝试了无数的组合

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

有人有线索吗?提前谢谢

尝试改变这一点

    ->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('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')
->setParameters(数组(
'user'=>$user',column'=>$column',date'=>午夜$midNight,
))
->其中('user=:user','g.timestamp<:date','column=:column')

->其中('user=:user','g.timestamp<:date','column=:column')
->设置参数(数组)(
'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('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')
->setParameters(数组(
'user'=>$user',column'=>$column',date'=>午夜$midNight,
))
->其中('user=:user','g.timestamp<:date','column=:column')

->其中('user=:user','g.timestamp<:date','column=:column')
->设置参数(数组)(
'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('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')
->setParameters(数组(
'user'=>$user',column'=>$column',date'=>午夜$midNight,
))
->其中('user=:user','g.timestamp<:date','column=:column')
用这个

试着改变这个

    ->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('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')
->setParameters(数组(
'user'=>$user',column'=>$column',date'=>午夜$midNight,
))
->其中('g.user=:user','g.timestamp<:date','g.column=:column')
尝试更改此设置

    ->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('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')
->setParameters(数组(
'user'=>$user',column'=>$column',date'=>午夜$midNight,
))
->其中('user=:user','g.timestamp<:date','column=:column')
用这个

试着改变这个

    ->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('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')
->setParameters(数组(
'user'=>$user',column'=>$column',date'=>午夜$midNight,
))
->其中('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;
}
公共函数getStatsByDQL(用户$User,字符串$col)
{
$midNight=date_create('00:00:00')->格式('Y-m-d H:i:s');
$parameters=(数组('user'=>$user,'date'=>$midNight,
));
$em2=$this->getDoctrine()->getManager()->getRepository('AppBundle:ExerciseStats'))
->createQueryBuilder('g')
->setParameters($parameters)
->其中('g.user=:user','g.timestamp<:date')
->选择('g..$col)
->setMaxResults(1)
->加入('g.user','user'))
->orderBy('g..$col,'DESC')
->getQuery()->getResult(\doctor\ORM\Query::hydrome\u数组);
返回$em2;
}

这将返回我要查找的正确数据,即请求的列及其内容。谢谢大家的意见。非常感谢。:)

我已经解决了这个问题,它太简单了,我差点开枪自杀。因此,需要从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;
}
公共函数getStatsByDQL(用户$User,字符串$col)
{
$midNight=date_create('00:00:00')->格式('Y-m-d H:i:s');
$parameters=(数组('user'=>$user,'date'=>$midNight,
));
$em2=$this->getDoctrine()->getManager()->getRepository('AppBundle:ExerciseStats'))
->createQueryBuilder('g')
->setParameters($parameters)
->其中('g.user=:user','g.timestamp<:date')
->选择('g..$col)
->setMaxResults(1)
->加入('g.user','user'))
->orderBy('g..$col,'DESC')
->getQuery()->getResult(\doctor\ORM\Query::hydrome\u数组);
返回$em2;
}

这将返回我要查找的正确数据,即请求的列及其内容。谢谢大家的意见。非常感谢。:)

那么您实际上有一个名为column的数据库表列?Column在mysql中是一个保留字,所以结尾不好。实际上我没有一个名为Column的列,如果你看代码,你会看到它是变量名。这是DQL,不是SQL,所以我在那里很安全。为了安全起见,我用另一个变量名对它进行了测试,结果没有什么不同,相同的错误消息。DQL被转换为SQL,因此同样的限制也适用column=:column'与错误消息一样强烈地表示名为column的列。是否尝试动态指定实际列?我想我只是不理解这个设计。dump($qb->getQuery()->getSQL()将显示生成的sql。我有50个列要从中获取数据,因此使用了变量。我已将变量从列更改为安全的,仅供参考(即将出现相同的错误消息)。因此,我想使用常量将其放入调用中(其中“bench_press_1_weight”是一个常量。顺便说一句,bench_press_1_weight是数据库中的一列(还有大约50个类似的列,需要在不同的时间分别调用)。希望这能澄清问题。谢谢。所以将->选择('g.column')更改为->选择('g.$column))对orderby也一样。从where语句中完全删除列内容。那么实际上您有一个名为column的数据库表列?column在mysql中是一个保留字,因此不会很好地结束。实际上我没有一个名为column的列,如果您查看代码,您会看到它是变量名。这是DQL,而不是SQL,所以我是安全。为了安全起见,我测试了一下