En metode ville være at bruge et MySQL REGEXP-kald i et prædikatudtryk.
Hvor $select
er en forekomst af Zend\Db\Sql\Select
og $searchFor
er dit søgeord:
Den oprindelige understrengsøgning kan bruge en where som denne...
$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
),
));
...og helordsversionen af ovenstående er:
$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
),
));
Bemærk, at dette er søgninger med flere felter, så jeg har lavet et PredicateSet::COMBINED_BY_OR
. Det tog mig alt for lang tid at stoppe med at fjolle rundt med \b
i mit regex. Håber dette sparer nogen derude lidt tid.