我需要检查一个表中是否存在多个项。问题是,我必须检查连接在一起的两个字段中的字符串,就像我想一起检查名字和姓氏,但要分别存储它们一样。我对学说是新手,在对这个主题进行了广泛的研究后,我尝试了两种方法:
$params = array('two words', 'another here');
// writing the DQL
$query = $this->getEntityManager()
->createQuery("
SELECT foo.f1, foo.f2
FROM MyCompanyMyBundle:MyEntity foo
WHERE CONCAT(CONCAT(foo.f1, ' '), foo.f2) IN (:params)
")->setParameter('params', implode(', ', $params));
注:由于CONCAT_WS不受条令支持,因此需要双CONCAT。
这应该有效(imo),但:params被一个字符串("两个单词,另一个在这里")取代,而不是由逗号分隔的一系列字符串。(我试着在$params中的元素周围加上单独的撇号,但这也不起作用,它被Docrine转义了("两个单词","其他在这里")。
// trying the query builder
$qb = $this->createQueryBuilder('foo');
$query = $qb
->select(array('foo.f1', 'foo.f2' ))
->where(
$qb->expr()->in(
$qb->expr()->concat( $qb->expr()->concat('foo.f1', ' '), 'foo.f2'),
':params'
)
)
->setParameter('params', implode(', ', $params))
->getQuery();
我想我甚至还没有接近查询生成器,所以如果是这样的话,我很感激任何帮助!
因此,我的目标是返回两列值一起正确的行。
该走哪条路,我做错了什么?
问题似乎在于将setParameter()
与IN(...)
子句一起使用的方式-应该传递一个数组,而不是内爆-
$params = array('two words', 'another here');
// writing the DQL
$query = $this->getEntityManager()
->createQuery("
SELECT foo.f1, foo.f2
FROM MyCompanyMyBundle:MyEntity foo
WHERE CONCAT(CONCAT(foo.f1, ' '), foo.f2) IN (:params)
")->setParameter('params', $params);