当列是数组时如何做 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);
我有实体:公司,其中有一列:类型。
类型可以是字符串,也可以是字符串数组。
例如:类型可以是 "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);