Един метод би бил да се използва извикване на MySQL REGEXP в израз на предикат.
Където $select
е екземпляр на Zend\Db\Sql\Select
и $searchFor
е вашата дума за търсене:
Оригиналното търсене на подниз може да използва където като това...
$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
),
));
...и цялата дума на горното е:
$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
),
));
Обърнете внимание, че това са многополеви търсения, така че направих PredicateSet::COMBINED_BY_OR
. Отне ми твърде много време, за да спра да се заблуждавам с \b
в моя регулярен израз. Надяваме се, че това ще спести време на някого.