如何在createQueryBuilder中使用通配符?

Mik*_*ike 3 query-builder symfony doctrine-orm

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

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

    return $qb->getQuery()
              ->getResult();
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Kas*_*een 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();
}
Run Code Online (Sandbox Code Playgroud)

但我认为不建议使用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();
Run Code Online (Sandbox Code Playgroud)

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

我还应该指出,我在每个示例中使用了不同的约定来将参数传递给查询,第一个使用的: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();
Run Code Online (Sandbox Code Playgroud)