如何在createQueryBuilder中使用通配符?

时间:2011-11-27 23:44:33

标签: symfony doctrine-orm query-builder

在我的存储库类中,我使用:

public function getItemsByTag($tag)
{
    $qb = $this->createQueryBuilder('c')
               ->select('c')
               ->where('c.tags LIKE %bipolar%')
               ->addOrderBy('c.id');

    return $qb->getQuery()
              ->getResult();
}

但不幸的是,这不起作用..有谁知道这是如何工作的?或者我是否必须在没有QueryBuilder的情况下构建自定义查询?

谢谢!

4 个答案:

答案 0 :(得分:13)

根据单个参数进行搜索:

我认为应该去:

public function getItemsByTag($tag)
{
    $qb = $this->createQueryBuilder('c')
           ->select('c')
           ->where('c.tags LIKE :tag')
           ->addOrderBy('c.id')
           ->setParameter('tag', $tag);

    return $qb->getQuery()->getResult();
}

但我认为不建议使用LIKE作为使用查询构建器的一部分,所以你应该这样做:

$qb = $this->createQueryBuilder('c');

$qb->select('c')
   ->where($qb->expr()->like('c.tags', '?1'))
   ->addOrderBy('c.id')
   ->setParameter(1, $tag);

return $qb->getQuery()->getResult();

查看文档以获取更多信息,在标题为Helper Methods的部分中有一个类似表达式的示例

我还应该指出,我在每个示例中使用了不同的约定来将参数传递给查询,第一个使用了由:tag设置的命名参数setParameter('tag', $value),第二个只是一个编号参数?1,如果您愿意,也可以在第二个示例中轻松使用命名参数。

使用一系列参数进行搜索:

您还询问了一系列喜欢的内容。这里是一个OR表达式,但如果你想搜索所有标签,你可以将它改为AND。

为了制作一个“LIKE数组”,你只需要自己构建表达式。

$qb = $this->createQueryBuilder('c');

$orExpr = $qb->expr()->orX();

for ($i = 0; $i < count($tags); $i++) {
    $orExpr->add($qb->expr->like('c.tags', "?$i"));

    // You may have to set params later in a loop after $orExpr has been
    // added to the queryBuilder.
    $qb->setParameter($i, $tags[$i]);
}

$qb->select('c')->where($orExpr)->addOrderBy('c.id');

return $qb->getQuery()->getResult();

答案 1 :(得分:3)

如果您不想用变量替换查询但使用静态字符串,则必须将字符串放在撇号中。

使用撇号而不是引号!否则,Doctrine2 Lexer将抛出异常。

所以在你的情况下迈克你可以使用:

'c.tags LIKE \'%bipolar%\''

"c.tags like '%bipolar%'"

答案 2 :(得分:1)

我对Symfony了解不多,但基于我对PHP和MySQL的了解,我想你的意思是'c.tags LIKE "%bipolar%"'。您可能需要%bipolar%附近的引号。

答案 3 :(得分:0)

简单地说:

public function getItemsByTag($tag)
{
    $qb = $this->createQueryBuilder('c')
           ->select('c')
           ->where( $qb->expr()->like('c.tags', ':tags') )
           ->addOrderBy('c.id');

    $qb->setParameter('tags', '%' . $tag . '%' );

    return $qb->getQuery()->getResult();
}