【问题标题】:Symfony query => Error: Expected Literal, got '"'Symfony 查询 => 错误:预期文字,得到 '"'
【发布时间】:2015-09-02 20:21:32
【问题描述】:

我有以下查询: (没有 addSelect('CASE ... END AS HIDDEN loquer') 部分它可以正常工作 目标是在我的 cmets 中添加一些订单。但是这部分触发了来自 symfony 的以下消息:Error: Expected Literal, got '"'

public function myfindArticleandCommentsandScores($article,$language){
    $qb = $this->createQueryBuilder('a');
    $qb->leftjoin('a.comments','c')
        ->addSelect('c')
        ->leftJoin('c.scores','s')
        ->addSelect('s')
        ->leftJoin('s.user','u')
        ->addSelect('u')
        ->addSelect('
                CASE 
                    WHEN c.show = "yes" THEN 1  // PROBLEME IS HERE
                    ELSE 2
                END AS HIDDEN show_order  
            ')
        ->where(
                    $qb->expr()->eq('a.id', '?1'),
                    $qb->expr()->orX(
                        $qb->expr()->eq('c.langue', '?2'),
                        $qb->expr()->eq('c.langue', '?3')
                        )
                )
        ->setParameters(array(
                    '1'=> $article,
                    '2'=> $language,
                    '3'=> 'EN',
                ))
        ->orderBy('show_order', 'ASC')
        ->addOrderBy('c.scorenote', 'DESC');

    return $qb->getQuery()
                ->getResult();
}

我尝试将“yes”替换为“yes”,但随后收到以下消息:FatalErrorException: Parse: syntax error, unexpected 'oui' (T_STRING)

【问题讨论】:

  • 'Yes' 是正确的,但使用 " 作为字符串分隔符

标签: php symfony query-builder


【解决方案1】:

使用 setParameter 将占位符替换为字符串或使用 "xyz='yes'"

现在代码应该是什么样子(一种可能的方式):

public function myfindArticleandCommentsandScores($article,$language){
    $qb = $this->createQueryBuilder('a');
    $qb->leftjoin('a.comments','c')
        ->addSelect('c')
        ->leftJoin('c.scores','s')
        ->addSelect('s')
        ->leftJoin('s.user','u')
        ->addSelect('u')
        ->addSelect('
                CASE 
                    WHEN c.show = \'yes\' THEN 1  // PROBLEME IS HERE
                    ELSE 2
                END AS HIDDEN show_order  
            ')
        ->where(
                    $qb->expr()->eq('a.id', '?1'),
                    $qb->expr()->orX(
                        $qb->expr()->eq('c.langue', '?2'),
                        $qb->expr()->eq('c.langue', '?3')
                        )
                )
        ->setParameters(array(
                    '1'=> $article,
                    '2'=> $language,
                    '3'=> 'EN',
                ))
        ->orderBy('show_order', 'ASC')
        ->addOrderBy('c.scorenote', 'DESC');

    return $qb->getQuery()
                ->getResult();
}

【讨论】:

  • 好的,等几分钟。
【解决方案2】:

应尽可能避免在 DQL 中使用字符串分隔符。

->addSelect('
    CASE 
        WHEN c.show = :show THEN 1
        ELSE 2
    END AS HIDDEN show_order  
')
->setParameter('show', 'yes')

【讨论】:

    【解决方案3】:

    我添加了一个参数,就像这样:

    ->addSelect('
        CASE 
               WHEN t.loquage = :show_first THEN 1
               ELSE 2
        END AS HIDDEN loquer  
                ')
    ->setParameters(array(
            'show_first'=> 'oui', 
    

    感谢帮助我的 Qoop。

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多