7

このクエリが機能しない理由を教えてください。一重引用符と二重引用符も交互に試しました。

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

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

Doctrine は単純に を返しますInvalid parameter number: number of bound variables does not match number of tokens

また、そのようなクエリは createQuery メソッドと createQueryBuilder のどちらを使用して実行した方がよいでしょうか?

4

1 に答える 1

32

PDO は、キーワードと % ワイルドカードの両方を 1 つのトークンとして扱います。プレースホルダーの横にワイルドカードを追加することはできません。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 に答える