当列是数组时如何做WHERE?

时间:2016-09-16 12:56:54

标签: symfony doctrine query-builder

我有和实体:公司,它有一列:类型。

Type可以是字符串,也可以是字符串数组。

例如:类型可以是" Foo"," Bar"或数组(" Foo"," Bar")。

我无法弄清楚如何获得该类型所包含的所有公司" Bar"。

我试过

$qb = $this->companyRepository()->createQueryBuilder("c");
            $companies = $qb
                ->select("c")       
                ->Where( $qb->expr()->in('c.type', array($qb->expr()->literal('Bar'))))
                ->getQuery()
                ->getResult();

仅获取类型为" Bar"的公司,而不是数组所在的公司(" Foo"," Bar")。

我尝试了$ qb-> expr() - >喜欢(...)而不是$ qb-> expr() - > in(..),结果相同。

如何获得包含类型的公司" Bar"? (假设类型不仅仅是我给出的3个值作为例子)

2 个答案:

答案 0 :(得分:1)

正如我在评论中所写,当使用doctrines数组列时,您无法查询单个数组值。但由于这些列要求您不要在数组值中使用逗号,因此可以编写使用此要求的查询。

而不是正则表达式(需要doctrine extension),您还可以编写LIKE查询,如下所示:

$query = 'Bar';

$qb = $this->companyRepository()->createQueryBuilder("c");
$companies = $qb
    ->where('c.type LIKE :only OR c.type LIKE :first OR c.type LIKE :last OR c.type LIKE :middle')
    ->setParameter('only', $query)
    ->setParameter('first', sprintf('%s%%,', $query))
    ->setParameter('last', sprintf('%%,%s', $query))
    ->setParameter('middle', sprintf('%%,%s,%%', $query))
    ->getQuery()
    ->getResult()
;

dump($companies);

答案 1 :(得分:0)

这是一个类似的问题,并为您解答。

Symfony2 Doctrine querybuilder where IN

但是,我建议使用DQL,如果它是一个选项,或者只使用Doctrine和PDO而不是QueryBuilder。