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 中实现子查询?

Doctrine and Symfony2: WHERE a.title LIKE $array

DQL选择具有一列MAX值的每一行

如何在 Doctrine 2 DQL 中使用 now()?

带有类名的 Doctrine 2 DQL 查询?

Doctrine:不指定类完全限定名 (FQN) 的 DQL 查询