我尝试更新Doctrine查询以接受一组值来搜索字段。我需要它们是不区分大小写的匹配所以我使用like子句,否则我可以使用in
这会使事情变得更简单。我最终想要的是一个类似的查询:
"SELECT * FROM tableName t WHERE (t.option LIKE "option1" OR t.option LIKE "option2" OR t.option LIKE "option3");
所以我尝试了以下内容:
function getItems( $options = array() ) {
$qb = $this->_em->createQueryBuilder();
$qb->from('tableName', 't')
->select('t');
$conditions = $qb->expr()->orX();
foreach ($options as $option) {
$conditions->add($qb->expr()->like('option', $option));
}
$qb->andWhere($conditions);
}
return $qb->getQuery()->getArrayResult();
}
getItems( array('option1','option2','option3') );
但价值观不会被转义,所以你最终会得到如下的查询,这会引发错误:
SELECT * FROM tableName t WHERE (t.option LIKE option1 OR t.option LIKE option2 OR t.option LIKE option3)
这通常是您使用命名参数的地方,如:
$qb->expr()->like('option', ':option');
$qb->setParameter( 'option', $option );
但是您无法使用值数组多次设置相同的参数名称。我可能会遗漏一些明显的东西,一些有学说的新手。有什么想法吗?
答案 0 :(得分:1)
您应该使用文字表达式:
$conditions->add($qb->expr()->like('option', $qb->expr()->literal($option)));