2013-01-20 53 views
5

任何人都可以啓發我爲什麼這個查詢不工作請嗎?我嘗試在單引號和雙引號之間交替。使用通配符與Doctrine的createQuery方法

$em = $this->getDoctrine()->getManager(); 

$query = $em->createQuery('SELECT t FROM AcmeBlogBundle:BlogTag t WHERE t.title LIKE \'%:title%\'') 
->setParameter('title', $keyword); 

主義只是返回Invalid parameter number: number of bound variables does not match number of tokens

此外,使用createQuery方法或createQueryBuilder執行此類查詢會更好嗎?

+0

我想你想選擇所有的表,因爲你必須使用SELECT * ...而不是SELECT t。是它嗎? – eLRuLL

回答

22

PDO treats both the keyword and the % wildcards as a single token. You cannot add the wildcards next to the placeholder. You must append them to the string when you bind the params

另請參閱this comment的PHP文檔。

因此,你需要做到以下幾點:

$qb = $em->createQueryBuilder(); 

$qb 
    ->select('tag') 
    ->from('AcmeBlogBundle:BlogTag', 'tag') 
    ->where($qb->expr()->like('tag.title', ':title')) 
    ->setParameter('title', '%' . $keyword . '%') 
; 

$query = $em->createQuery('SELECT t FROM AcmeBlogBundle:BlogTag t WHERE t.title LIKE :title'); 
$query->setParameter('title', '%' . $keyword . '%'); 

我更喜歡使用查詢生成器,因爲它是結構更好,使你的發言更容易維護

+1

謝謝你,先生,完美地完成了這項工作。謝謝你的幫助。 –