Yii2 составление запроса к БД с %
мне нужно осуществить выборку из базы данных, по строке, то есть, если человек в поиске набирает словосочетание, то ему подыскиваются и комбинации например : люблю программировать, ему подгружается так же пост со словами люблю очень сильно программировать
так вот, я написала запрос
return (new Query())
->select(...)
->from(...)
->andWhere(['like', 'bsp.text', $word])
->createCommand()->getRawSql();
перед этим я передаю word, как строку, состоящую из слово%слово , то есть существует отдельный метод, который вставляет % между словами
в итоговом запросе у меня неожиданно появляются слеши
AND (`bsp`.`text` LIKE '%слово\\%слово%')
отсюда рушится весь запрос
Ответы (2 шт):
Используйте метод ->andFilterWhere с последним параметром false.
Например:
->andFilterWhere(['like', 'bsp.text','слово%слово', false]);
Если вам нужно сформировать именно такой запрос, то можно использовать \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%')