2013-04-16 1 views
0

Я пытаюсь сравнить две строки с использованием CodeIgniter и Mapper данных с PHP и MySQL, я нашел функцию similar_text для PHP и использовать его в этой функции:DataMapper сравнения строк SQL и PHP

ли кто-нибудь эквивалент similar_text для Data Mapper? Большое вам спасибо!

+0

Как вы понимаете: «для Data Mapper»? Вы имеете в виду что-то, что могло бы возвращать аналогичные результаты из базы данных напрямую (так что не для datamapper, а для sql)? Какую систему баз данных вы используете? – complex857

+0

для запуска кода по умолчанию работает с активной записью, но моему боссу это не нравится, мы используем datamapper, и некоторые вещи очень разные. Я сражаюсь с разбиением на страницы. – Laura

+0

Как активная запись lib, так и DataMapper в CodeIgniter в конечном счете просто строят sql-запросы в конце. У вас есть некоторые не DM, использующие код для портирования? Пример кода в вашем вопросе будет выглядеть аналогично, если он построен с использованием обычного CI. 'Similar_text()' - это просто встроенный php-метод, поэтому он не «для» DM или AR. Может быть, мой английский, но я просто не понимаю, в чем ваш вопрос (-: Возможно, вы могли бы записать код, который вы хотите создать в DM, и объяснить, что он должен делать (вроде разработки с желаемым мышлением) – complex857

ответ

0

Алгоритм, реализованный в функции 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, 
)); 
+0

Спасибо большое! Я не могу использовать звуки(), но попробовал второй вариант. – Laura