Doctrine DQL(Symfony2) - WHERE连接字段是IN参数

时间:2014-02-28 13:24:10

标签: php symfony doctrine-orm dql

我需要检查表中是否存在多个项目。问题是我必须检查连接的两个字段中的字符串,如果我想一起检查名字和姓氏,但是将它们分开存储。我是学说的新手,经过对该主题的广泛研究,我尝试了两种方法:

$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();

我想我甚至不接近查询构建器,所以如果这是要走的路,我感谢任何帮助!

所以我的目标是返回两列值正确的行。

这是要走的路,我做错了什么?

1 个答案:

答案 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);