我可以在doctrine中的WHERE IN ARRAY查询中实现LIKE条件吗?

时间:2014-11-25 18:10:11

标签: php arrays symfony doctrine-orm sql-like

我正在使用Doctrine QueryBuilder创建一个查询,以通过电子邮件结尾选择一堆用户。我有一系列的电子邮件结尾,例如['@someservice.com', '@anotherservice.com' ]

我知道我可以通过WHERE IN选择数组中的字符串:

$qb= $this
    ->createQueryBuilder('u')
    ->orderBy('u.id', 'asc')
    ->where('u.email IN (:emails)')
    ->setParameter('emails', [
        '@someservice.com',
        '@anotherservice.com'
    ]);

然而,对于字符串的确切出现以及查询的查询当然会返回一个空的结果集。

这就是为什么我想在数组上进行LIKE搜索,但却采取以下措施:

$qb= $this
    ->createQueryBuilder('u')
    ->orderBy('u.id', 'asc')
    ->where('u.email LIKE IN (:emails)')
    ->setParameter('emails', [
        '%@someservice.com',
        '%@anotherservice.com'
    ]);

不幸失败了。是否有一些语法糖用于执行这样的查询,或者我是否必须通过一堆orHaving调用进行查询?

2 个答案:

答案 0 :(得分:2)

我做了类似的事情:

foreach($emailEndings as $index => $ending) {
    $qb->orWhere("u.email LIKE :email$index");
    $qb->setParameter("email$index", $ending);
}

索引很重要,否则只选择数组的最后一个条目。

请注意,如果您有多个where子句,则会因orWhere子句而遇到麻烦。您无法将其更改为andWhere,因为这会导致结果集为空。在该用例中,您需要将Orx中的条件分组为andWhere,如下所示:

/**
 * @param QueryBuilder $qb
 */
protected function addInternalFilter(QueryBuilder $qb)
{
    $conditions = [];
    foreach ($this->emailEndings as $index => $ending) {
        $conditions[] = "u.email LIKE :string$index";
        $qb->setParameter("string$index", $ending);
    }

    if (empty($conditions)) {
        throw new \LogicException('Conditions are empty.');
    }

    $qb->andWhere(new Orx($conditions));
}

答案 1 :(得分:0)

不能那样做。 %是LIKE,LIKE不用于IN。

您只能使用OR来处理它:

->where("u.email LIKE '%@someservice.com' OR u.email LIKE '%@anotherservice.com'")