基于单个参数的搜索:
我认为应该去:
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();