Yii2 составление запроса к БД с %

мне нужно осуществить выборку из базы данных, по строке, то есть, если человек в поиске набирает словосочетание, то ему подыскиваются и комбинации например : люблю программировать, ему подгружается так же пост со словами люблю очень сильно программировать

так вот, я написала запрос

return (new Query())
        ->select(...)
        ->from(...)
        ->andWhere(['like', 'bsp.text', $word])
        ->createCommand()->getRawSql();

перед этим я передаю word, как строку, состоящую из слово%слово , то есть существует отдельный метод, который вставляет % между словами

в итоговом запросе у меня неожиданно появляются слеши

AND (`bsp`.`text` LIKE '%слово\\%слово%')

отсюда рушится весь запрос


Ответы (2 шт):

Автор решения: delikates

Используйте метод ->andFilterWhere с последним параметром false.

Например: ->andFilterWhere(['like', 'bsp.text','слово%слово', false]);

→ Ссылка
Автор решения: user3265030

Если вам нужно сформировать именно такой запрос, то можно использовать \yii\db\Expression. Например так:

$word = 'word1%word2';

return (new Query())
    ->select(...)
    ->from(...)
    ->andWhere(['like', 'bsp.text', new \yii\db\Expression("'%$word%'")])
    ->createCommand()->getRawSql();

И получим нормальное условие без лишних слешей.

AND (`bsp`.`text` LIKE '%word1%word2%')

Но в этом случае у вас будет зависимость от порядка слов. Т.е. пост с фразой "Программировать я очень люблю" уже не покажется. Чтобы и он тоже попал в выборку, то лучше для каждого слова добавить своё условие 'like'. Например вот так:

$word = 'word1%word2';
$words = explode('%', $word);
$query = (new Query())
    ->select(...)
    ->from(...);

foreach ($words as $tempWord) {
    $query->andWhere(['like', 'bsp.text', $tempWord])
}

return $query->createCommand()->getRawSql();

Тут мы получим:

AND (`bsp`.`text` LIKE '%word1%') AND (`bsp`.`text` LIKE '%word2%')
→ Ссылка