Doctrine DQL (Symfony2) - WHERE 连接字段是 IN params
Posted
技术标签:
【中文标题】Doctrine DQL (Symfony2) - WHERE 连接字段是 IN params【英文标题】:Doctrine DQL (Symfony2) - WHERE concatenated field is IN params 【发布时间】:2014-02-28 13:24:09 【问题描述】:我需要检查一个表中是否存在多个项目。问题是我必须检查连接在一起的两个字段中的字符串,就像我想同时检查名字和姓氏一样,但将它们分开存储。我是学说新手,在对该主题进行了广泛研究之后,我尝试了两种方法:
$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));
注意:由于 Doctrine 不支持 CONCAT_WS,所以需要双 CONCAT。
这应该可以工作(imo),但是 :params 被替换为 one 字符串('两个单词,另一个在这里'),而不是由逗号分隔的一系列字符串。 (我尝试在 $params 中的元素周围放置单独的撇号,但这也不起作用,它被 Docrine ('\'two words\', \'another here\'') 转义)。
// 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();
我想我什至不熟悉查询生成器,所以如果这是要走的路,我很感激任何帮助!
所以我的目标是同时返回两列值正确的行。
要走哪条路,我做错了什么?
【问题讨论】:
在IN(...)
子句中的参数上使用 setParameter()
时,您应该直接传递一个数组 - setParameter('params', $params)
。这可能会也可能不会解决您的问题。
有效!如果您将其发布为答案,我很乐意接受。谢谢!
以为会有更多内容,但我肯定会发布答案。谢谢。
【参考方案1】:
看起来问题是你使用 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);
【讨论】:
我不知道为什么文档中没有列出:http://docs.doctrine-project.org/en/2.0.x/reference/query-builder.html#binding-parameters-to-your-query以上是关于Doctrine DQL (Symfony2) - WHERE 连接字段是 IN params的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Doctrine 在 Symfony2 中实现子查询?