当列是数组时如何做 WHERE?

How to do a WHERE when the column is an array?

我有实体:公司,其中有一列:类型。

类型可以是字符串,也可以是字符串数组。

例如:类型可以是 "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()->like(...) 代替 $qb->expr()->in(..) 得到相同的结果。

如何获取 类型包含 "Bar" 的公司? (假设 type 不仅仅是我举的 3 个值)

这是一个类似的问题,并为您提供了答案。

Symfony2 Doctrine querybuilder where IN

但是,如果可以的话,我会建议使用 DQL,或者只使用 Doctrine 和 PDO 而不是 QueryBuilder。

正如我在评论中所写,您在使用 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);