嵌套式

时间:2015-11-20 06:54:31

标签: php mysql symfony doctrine

我尝试更新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 );

但是您无法使用值数组多次设置相同的参数名称。我可能会遗漏一些明显的东西,一些有学说的新手。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您应该使用文字表达式:

$conditions->add($qb->expr()->like('option', $qb->expr()->literal($option)));