Алгоритм, реализованный в функции PHP similar_text()
, недоступен в MySQL. Существует в MySQL soundex, которые могут быть использованы с выражением, как:
... where name sounds like "some input"
в SQL, так что в вашем PHP кода это будет выглядеть так:
$v = new Vendedor();
$v->where('CONCAT(name, " ", lasta_name1, " ", lasta_name2) sounds like ', $name);
// ...
но Саундэкс это действительно не работает с не английский текст. Вы можете попробовать различную реализацию левенштейна, см. this или this.
Оба они по-прежнему будут иметь довольно плохую производительность, так как базе данных все еще приходится сравнивать каждую строку, чтобы вы действительно не выигрывали на этом фронте, но вы изменяете алгоритм сходства, и это может быть не совсем нормально.
Если вы решили сохранить функцию similar_text()
, вы можете реализовать разбиение на страницы на массив с помощью array_slice()
, предпочтительно только создавая заказ один раз и сохраняя информацию в некотором кеше (memcached, plain files, apc cache ...), поэтому последующие вызовы с этим входом могут обслуживаться без повторного вычисления порядка, таким образом, быстрее. Я полагаю, что-то вроде этого (части кэша являются optiona):
function get_similar_vevendors($name, $offset, $limit) {
// Imaginary cache library,
// it would return the previously cached search results under a key
// created from the name
if (Cache::has('similar_vevendors_'.$name)) {
$ven = Cache::get('similar_vevendors_'.$name)
} else {
// your orignal code here, filling $ven array filled with similar Vendedor's
// ...
// saving the created similar vevendors array in cache
Cache::store('similar_vevendors_'.$name, $ven);
}
// return both the count of the results for pagination
// and a acting as the current "page"
return array(count($ven), array_slice($ven, $offset, $limit));
}
Таким образом, вы можете использовать одни и те же параметры для подкачки корыта массива, который вы будете использовать в SQL, и вы можете инициализировать библиотеку постраничной CI с чем-то вроде этого :
// $offset is coming from the links generated by the pager
list($total_rows, $paged_vens) = get_similar_vevendors($name, $offset, $items_per_page);
$this->pagination->initialize(array(
'per_page' => $items_per_page,
'total_rows' => $total_rows,
));
Как вы понимаете: «для Data Mapper»? Вы имеете в виду что-то, что могло бы возвращать аналогичные результаты из базы данных напрямую (так что не для datamapper, а для sql)? Какую систему баз данных вы используете? – complex857
для запуска кода по умолчанию работает с активной записью, но моему боссу это не нравится, мы используем datamapper, и некоторые вещи очень разные. Я сражаюсь с разбиением на страницы. – Laura
Как активная запись lib, так и DataMapper в CodeIgniter в конечном счете просто строят sql-запросы в конце. У вас есть некоторые не DM, использующие код для портирования? Пример кода в вашем вопросе будет выглядеть аналогично, если он построен с использованием обычного CI. 'Similar_text()' - это просто встроенный php-метод, поэтому он не «для» DM или AR. Может быть, мой английский, но я просто не понимаю, в чем ваш вопрос (-: Возможно, вы могли бы записать код, который вы хотите создать в DM, и объяснить, что он должен делать (вроде разработки с желаемым мышлением) – complex857