Поиск по сайту

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Vi_ru_S
Сообщения: 61
Зарегистрирован: 2018.08.14, 07:39
Откуда: Владивосток
Контактная информация:

Поиск по сайту

Сообщение Vi_ru_S »

Все привет. Не могу найти статей как можно сделать безболезненный поиск по сайту по двум ключевым например словам в поиске
Сделал вот так через like но это не совсем то что мне нужно

Код: Выделить всё

    public function search($params) {

        $query = CatNomenclature::find();


        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $this->load($params);




        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }

        if ($this->search) {
            $query->orFilterWhere(['like', 'id', $this->search])
                    ->orFilterWhere(['like', 'name', $this->search]);
           
        }
      
        return $dataProvider;
    }
У меня например есть такое значение в БД
Аккумулятор для Apple iPad Air 2 Orig
Аккумулятор для Apple iPhone 4 Copy
и я хочу получить результат поиска по словам Аккумулятор iPad . Как мне это сделать?
В действительности все иначе чем на самом деле. Антуан де Сент Экзюпери
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Поиск по сайту

Сообщение yiiliveext »

Только в последовательности слов будет так.

Код: Выделить всё

if ($this->search) {
            $query->orFilterWhere(['like', 'id', $this->search])
                    ->orFilterWhere('name like \'%' . str_replace(' ', '%', trim($this->search)) . '%\'');
           
        }
Последний раз редактировалось yiiliveext 2019.08.17, 19:00, всего редактировалось 1 раз.
Аватара пользователя
Vi_ru_S
Сообщения: 61
Зарегистрирован: 2018.08.14, 07:39
Откуда: Владивосток
Контактная информация:

Re: Поиск по сайту

Сообщение Vi_ru_S »

yiiliveext писал(а): 2019.08.17, 18:46 Только в последовательности слов будет так.

Код: Выделить всё

if ($this->search) {
            $query->orFilterWhere(['like', 'id', $this->search])
                    ->orFilterWhere('name like \'%' . str_replace(' ', '%', trim($this->name)) . '%\'');
           
        }
Не работает :?
В действительности все иначе чем на самом деле. Антуан де Сент Экзюпери
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Поиск по сайту

Сообщение yiiliveext »

Vi_ru_S писал(а): 2019.08.17, 18:59 Не работает :?
Исправил, name на search замените
Аватара пользователя
Vi_ru_S
Сообщения: 61
Зарегистрирован: 2018.08.14, 07:39
Откуда: Владивосток
Контактная информация:

Re: Поиск по сайту

Сообщение Vi_ru_S »

yiiliveext писал(а): 2019.08.17, 19:01
Vi_ru_S писал(а): 2019.08.17, 18:59 Не работает :?
Исправил, name на search замените

Код: Выделить всё

        if ($this->search) {
            $query->orFilterWhere(['like', 'id', $this->search])
                    ->orFilterWhere(['name like \'%' . str_replace(' ', '%', trim($this->search)) . '%\'']);
        }
Operator 'NAME LIKE '%APPLE%черный%'' requires two operands.
В действительности все иначе чем на самом деле. Антуан де Сент Экзюпери
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Поиск по сайту

Сообщение yiiliveext »

Скобки квадратные уберите
Аватара пользователя
Vi_ru_S
Сообщения: 61
Зарегистрирован: 2018.08.14, 07:39
Откуда: Владивосток
Контактная информация:

Re: Поиск по сайту

Сообщение Vi_ru_S »

yiiliveext писал(а): 2019.08.17, 19:05 Скобки квадратные уберите
orFilterWhere Принимает массив. может другой метод там нужен?
В действительности все иначе чем на самом деле. Антуан де Сент Экзюпери
Аватара пользователя
Vi_ru_S
Сообщения: 61
Зарегистрирован: 2018.08.14, 07:39
Откуда: Владивосток
Контактная информация:

Re: Поиск по сайту

Сообщение Vi_ru_S »

yiiliveext писал(а): 2019.08.17, 19:05 Скобки квадратные уберите

Код: Выделить всё

   if ($this->search) {
            $query->orFilterWhere(['like', 'id', $this->search])
                    ->orWhere('name like \'%' . str_replace(' ', '%', trim($this->search)) . '%\'');
        }
Вот так вроде работает. Сейчас тетстить буду. Спасибо за помощь :D
В действительности все иначе чем на самом деле. Антуан де Сент Экзюпери
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Поиск по сайту

Сообщение yiiliveext »

А вот так в любой последовательности слов.

Код: Выделить всё

$words = explode(' ', trim($this->search));
$serachArray = ['AND'];
foreach ($words as $word) {
    $serachArray[] = ['like', 'name', $word];
}
$query->andFilterWhere(['OR', ['like', 'id', $this->search], $serachArray]);
Аватара пользователя
Vi_ru_S
Сообщения: 61
Зарегистрирован: 2018.08.14, 07:39
Откуда: Владивосток
Контактная информация:

Re: Поиск по сайту

Сообщение Vi_ru_S »

yiiliveext писал(а): 2019.08.17, 19:31 А вот так в любой последовательности слов.

Код: Выделить всё

$words = explode(' ', trim($this->search));
$serachArray = ['AND'];
foreach ($words as $word) {
    $serachArray[] = ['like', 'name', $word];
}
$query->andFilterWhere(['OR', ['like', 'id', $this->search], $serachArray]);

Код: Выделить всё

        if ($this->search) {
            $query->orFilterWhere(['like', 'id', $this->search]);
            $words = explode(' ', trim($this->search));
            $serachArray = ['AND'];
            foreach ($words as $word) {
                $serachArray[] = ['like', 'name', $word];
            }
            $query->orWhere(['OR', ['like', 'name', $this->search], $serachArray]);
        }
у меня вот так работает тока. Может кому полезно будет.
В действительности все иначе чем на самом деле. Антуан де Сент Экзюпери
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Поиск по сайту

Сообщение yiiliveext »

Это неверное решение. Приведенный мной код ищет либо по айди, либо по нахождению всех слов из поисковой фразы в поле name.
Ваш код ищет либо по айди, либо по нахождению всех слов из поисковой фразы в поле name, либо по полному совпадению фразы. Последнее не имеет смысла, поскольку будет выполнятся тогда же, когда и предыдущее условие. К тому же теперь вы не можете добавить еще один andFilterWhere к фильтру.
Ответить