Модель поиска Yii2 - PullRequest
       4

Модель поиска Yii2

0 голосов
/ 28 ноября 2018

На моем веб-сайте, когда я ищу Alex Lau, я покажу результат Alex Lau.Проблема в том, как я могу изменить код, чтобы при поиске Lau Alex возможно, он все равно отображал результат Alex Lau.Сейчас это не так.

$query->orFilterWhere(['like', 'fullname', $this->globalSearch])

Вот код в моей поисковой модели.

Пожалуйста, помогите мне с этим.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Лучший подход в соответствии с запросом MYSQL с использованием CONCAT(), как показано ниже

if( $this->fullname!== null && $this->fullname !== '' ){
    $searchTerms = explode(" ", $this->fullname);
    if( sizeof($searchTerms) > 1 ){
        $conditions[]='OR';
        foreach( $searchTerms as $term ){
            $conditions[] = ['like', 'fullname', new \yii\db\Expression('CONCAT(CONCAT("%","' . $term . '"),"%")')];
        }
        $query->orFilterWhere($conditions);
    } else{
        $query->orFilterWhere(
                ['like', 'fullname', new \yii\db\Expression('CONCAT(CONCAT("%","' . $searchTerms[0] . '"),"%")')]
        );
    }

}

ПРИМЕЧАНИЕ. Это работает правильно, если вы ищете имя в формате first last или first middle last, означает, что вы можете искать Alex Lau John или John Alex Lau Lau John Alex

0 голосов
/ 28 ноября 2018

Попробуйте это

$words = explode(' ',$this->globalSearch);

if (count($words) > 1) {
    foreach ($words as $word) {
        $query->orFilterWhere(['like', 'fullname', $word]);
    }
} else {
    $query->orFilterWhere(['like', 'fullname', $this->globalSearch]);
}

Примечание: Вы должны убедиться в наличии пробелов

...