Um método seria usar uma chamada MySQL REGEXP em uma expressão de predicado.
Onde
$select
é uma instância de Zend\Db\Sql\Select
e $searchFor
é o seu termo de pesquisa:A pesquisa de substring original pode usar um where como este...
$select->where(array(
new Predicate\PredicateSet(
array(
new Zend\Db\Sql\Predicate\Like('tag', '%' . $searchFor . '%'),
new Zend\Db\Sql\Predicate\Like('title', '%' . $searchFor . '%'),
),
Zend\Db\Sql\Predicate\PredicateSet::COMBINED_BY_OR
),
));
... e a versão de palavra inteira do acima é:
$select->where(array(
new Predicate\PredicateSet(
array(
new Zend\Db\Sql\Predicate\Expression("tag REGEXP '([[:<:]]" . $searchFor ."[[:>:]])'"),
new Zend\Db\Sql\Predicate\Expression("title REGEXP '([[:<:]]" . $searchFor ."[[:>:]])'"),
),
Zend\Db\Sql\Predicate\PredicateSet::COMBINED_BY_OR
),
));
Observe que estas são pesquisas de vários campos, então eu fiz um
PredicateSet::COMBINED_BY_OR
. Demorei muito para parar de brincar com \b
no meu regex. Espero que isso salve alguém lá fora algum tempo.