2013-10-02 71 views
1

我想運行這個學說查詢生成器查詢:爲什麼「SQLSTATE [42000]:語法錯誤或訪問衝突」?

$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服務器版本正確的語法使用近「用法u0_ WHERE u0_.var =‘三包’」在1號線

手動這是我使用的實體:

<?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  | 
+----+----------+-------+ 

回答

3

它發生是因爲'使用'是MySQL reserved word。所以我不得不將Usage table和Usage entity類重新命名爲其他東西。

1

逃逸單引號用反斜槓只有當用戶用雙引號內的工作。

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

你可能會更好地利用參數。報價問題完全消失。

usage_q = $repository->createQueryBuilder('u')->where('u.var = :something'); 
usage_q->setParameter('something','warranty'); 
+0

我試着用參數,我得到這個:'執行時出現異常'SELECT u0_.id AS id0,u0_.var AS var1,u0_.value AS value2 FROM Usage u0_ WHERE u0_.var =?'帶有參數[「保修」]: SQLSTATE [42000]:語法錯誤或訪問衝突:1064您的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以找到在第1行使用u0_ WHERE u0_.var ='warranty'附近使用的正確語法' –

+0

如果我嘗試簡單SQL查詢'SELECT value FROM \'Usage \'WHERE \'var \'='保修';' - 它的工作原理。但我不明白爲什麼QueryBuilder返回錯誤。 –

相關問題