Выражение критерия в ArrayCollection чувствительно к регистру - PullRequest
0 голосов
/ 12 октября 2019

У меня есть объект ArrayCollection от Hashtag (для сопоставления базы данных и таблицы установлено значение utf8_bin_ci), который я хочу сопоставить по критериям, но он не учитывает регистр .

Я пробовал выражения «Содержит», «Эквалайзер», «Запускается с», «Закрывается с», но при сопоставлении возвращает ноль, однако имеет много результатов без соответствия Критериям.

Если я добавлю strtolower / strtoupper к свойству $this->name, это сработает в указанном случае.

Как сделать так, чтобы критерии не учитывали регистр или совпадения здесь?

  public function getHashtags($max = null) {
    $hashtags = $this->hashtags;
    $hashtags->getIterator();
    $crit = Criteria::create()
                    ->where(Criteria::expr()->contains('name', $this->name))
    if (!empty($max)) {
      $crit->setMaxResults($max);
    }

    return $hashtags->matching($crit);
  }

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Ваш код вызывает getIterator(), что предотвратит любую магию базы данных, потому что он инициализирует коллекцию (которая загружает все записи), поэтому ваше сопоставление в любом случае не имеет значения.

Кроме того, функция contains использует strpos, что, очевидно, не учитывает регистр.

Поскольку ваш код уже извлекает все хэштеги, просто отфильтруйте его уже:

$hashtags = array_filter(function(Hashtag $hashtag) {
    return stripos($this->name, $hashtag->getName());
}, $this->hashtags);
if(!empty($max)) {
    $hashtags = array_slice($hashtags, 0, $max, true); 
    // remove true, if you don't care about keys  ^, this preserves them
}
return $hashtags;
0 голосов
/ 12 октября 2019

относительно @Jakumi правильный ответ:

$hashtags = array_filter($this->hashtags->toArray(), function (TwitterHashtag $hashtag) use ($fields) {
  foreach ($fields as $field) {
    if (false !== stripos($hashtag->getName(), $this->$field)) {
      return true;
    }
  }
});
if (!empty($max)) {
  $hashtags = array_slice($hashtags, 0, $max, false);
}
...