En metod skulle vara att använda ett MySQL REGEXP-anrop i ett predikatuttryck.
Där $select
är en instans av Zend\Db\Sql\Select
och $searchFor
är din sökterm:
Den ursprungliga delsträngssökningen kan använda en where så här...
$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
),
));
...och helordsversionen av ovanstående är:
$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
),
));
Observera att det här är sökningar i flera fält, så jag har gjort en PredicateSet::COMBINED_BY_OR
. Det tog mig alldeles för lång tid att sluta busa med \b
i mitt regex. Hoppas detta sparar någon där ute lite tid.