7

谁能告诉我为什么这个查询不起作用?我也尝试在单引号和双引号之间交替。

$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 执行这样的查询更好吗?

4

1 回答 1

32

PDO 将关键字和 % 通配符视为单个标记。您不能在占位符旁边添加通配符。绑定 params 时,必须将它们附加到字符串中

另请参阅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 . '%');

我更喜欢使用查询生成器,因为它更适合结构化并使您的语句更易于维护

于 2013-01-20T05:10:53.010 回答