Рассмотрим эти три строки «стог сена»:
а) foo bar
б) welcome to foo bar industries
с) foo barer
А теперь моя «игла»:
foo bar
(Хех)
Я хотел бы, чтобы мой фильтр соответствовал моей игле со строками сена a & b, но не c. Я пытался:
$collection->addAttributeToFilter('name', array('like' => '%'.$needle.'%'));
Но вышеупомянутое соответствует c.
Я также попробовал:
$collection->addAttributeToFilter('name', array('like' => '% '.$needle.' %')); // Note the spaces
Выше соответствует только с б.
Любая помощь очень ценится.
attributes
collection
collection-filtering
beingalex
источник
источник
addAttributeToFilter
следует заменить наaddFieldToFilter
.Возможное решение - использовать
REGEXP
вместоLIKE
:Из документации MySQL :
Обратите внимание, что если
$needle
в регулярных выражениях POSIX могут содержаться символы, имеющие особое значение, вам нужно их избегать. Смотрите также: /programming/4024188/php-function-to-escape-mysql-regexp-syntaxисточник
Принятый ответ не работает должным образом. Он проверяет только пробел до и после текста.
Предположим, у вас есть следующий список
Теперь, если вы попытаетесь найти куртку, используя принятый ответ, он вернет только Summer Jacket и Winter Jacket
Я думаю, что следующее решение лучше
источник
['eq' => $needle]
может быть добавлено четвертое условие , чтобы найти точные совпадения (или, лучше, использовать решение регулярных выражений, которое находит все границы, а не только пробелы)