1

我想运行这个 Doctrine Query Builder 查询:

$repository = $this->getDoctrine()->getRepository('MyBundle:Usage');
$usage_q = $repository->createQueryBuilder('u')->where('u.var = \'warranty\'');
$usage_result = $usage_q->getQuery()->getSingleResult();

但我总是得到:

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“Usage u0_ WHERE u0_.var = 'warranty'' 附近使用正确的语法

这是我的使用实体:

<?php

namespace Herbanist\AdminBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Usage
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Usage
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="var", type="string", length=20)
     */
    private $var;

    /**
     * @var string
     *
     * @ORM\Column(name="value", type="text")
     */
    private $value;


    public function getId()
    {
        return $this->id;
    }

    public function setVar($var)
    {
        $this->var = $var;

        return $this;
    }

    public function getVar()
    {
        return $this->var;
    }

    public function setValue($value)
    {
        $this->value = $value;

        return $this;
    }

    public function getValue()
    {
        return $this->value;
    }
}

使用表:

mysql> select * from `Usage`;
+----+----------+-------+
| id | var      | value |
+----+----------+-------+
|  1 | warranty | 0     |
+----+----------+-------+
4

2 回答 2

3

发生这种情况是因为 'USAGE' 是MySQL 保留字。所以我不得不将 Usage 表和 Usage 实体类重命名为别的东西。

于 2013-10-03T06:44:46.507 回答
1

仅当字符串在双引号内时,使用反斜杠转义单引号才有效。

usage_q = $repository->createQueryBuilder('u')->where("u.var = 'warranty'");

你可能会更好地利用参数。报价问题完全消失。

usage_q = $repository->createQueryBuilder('u')->where('u.var = :something');
usage_q->setParameter('something','warranty');
于 2013-10-02T21:52:24.630 回答