我需要检查表中是否存在多个项目。问题是我必须检查连接的两个字段中的字符串,如果我想一起检查名字和姓氏,但是将它们分开存储。我是学说的新手,经过对该主题的广泛研究,我尝试了两种方法:
$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,因为Doctrine不支持CONCAT_WS。
这应该有效(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();
我想我甚至不接近查询构建器,所以如果这是要走的路,我感谢任何帮助!
所以我的目标是返回两列值正确的行。
这是要走的路,我做错了什么?
答案 0 :(得分:3)
看起来问题就是你将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);