【问题标题】:How to do a WHERE when the column is an array?当列是数组时如何执行 WHERE?
【发布时间】:2016-09-16 12:56:54
【问题描述】:

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

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

例如:类型可以是“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(..) ,结果相同。

如何获得类型包含“酒吧”的公司? (假设 type 不仅仅是我给出的 3 个值作为示例)

【问题讨论】:

  • 事件虽然学说允许您使用数组列类型,但在数据库级别您无法访问单个数组元素(毕竟它只是一个文本块)。因此,您不能对这些进行查询。您有两个选择:正则表达式查询,或规范化您的数据库。
  • 有趣。我无法标准化我的数据库。正则表达式如何帮助我?我假设我只需要获取所有公司,然后在 foreach 循环中测试类型..
  • 教义数组列类型要求您在数组值中不能有逗号。因此,您可以搜索的任何值,要么只需要列中的值,要么需要以逗号开头或以逗号结尾,或两者兼而有之。对于这四种情况,您需要编写一个有效的正则表达式并将其用作您的标准。
  • 类似:/(^|,)foo(,|$)/,我会尽快用可用代码添加答案。
  • 顺便说一句。请注意,并非所有引擎都支持 Regex,因此您需要扩展以使其至少可用于 mysql。见:github.com/beberlei/DoctrineExtensions

标签: symfony doctrine query-builder


【解决方案1】:

正如我在 cmets 中所写的,在使用学说数组列时,您无法查询单个数组值。但是由于这些列要求您不要在数组值中使用逗号,因此可以编写一个利用此要求的查询。

除了正则表达式(需要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);

【讨论】:

    【解决方案2】:

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

    Symfony2 Doctrine querybuilder where IN

    但是,如果可以选择使用 DQL,或者仅使用带有 PDO 的 Doctrine 而不是 QueryBuilder,我建议使用它。

    【讨论】:

    • 我想你误读了我的问题,这不是要尝试做一个 Where In。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    相关资源
    最近更新 更多