3

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

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

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

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

谢谢!

4

4 回答 4

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();
于 2011-11-28T00:06:23.773 回答
3

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

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

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

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

或者

"c.tags like '%bipolar%'"
于 2012-06-12T09:25:51.000 回答
1

我对 Symfony 了解不多,但根据我对 PHP 和 MySQL 的了解,我想你的意思是'c.tags LIKE "%bipolar%"'. 您可能需要在 . 周围加上引号%bipolar%

于 2011-11-27T23:47:12.190 回答
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();
}
于 2021-05-31T11:17:36.640 回答