在我的存储库类中,我使用:
public function getItemsByTag($tag)
{
$qb = $this->createQueryBuilder('c')
->select('c')
->where('c.tags LIKE %bipolar%')
->addOrderBy('c.id');
return $qb->getQuery()
->getResult();
}
但不幸的是,这不起作用..有谁知道这是如何工作的?或者我是否必须在没有QueryBuilder的情况下构建自定义查询?
谢谢!
答案 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();
}