2016-04-02 5 views
0

Я пишу область для ресурса сообщений с текстовым столбцом, чтобы найти сообщения, содержащие ключевое слово. Они ключевое слово должно соответствовать только если есть пространство перед и пробел или типичный знак препинания после (.?!;,-)Как использовать буквенный знак вопроса в Laravel 4 query builder

Вот мой метод объем:

public function scopeContainsKeyword($query, $keyword) { 
    return $query->where('post', 'LIKE', '% '.$keyword.' %') 
       ->orWhere('post', 'LIKE', '% '.$keyword.'.%') 
       ->orWhere('post', 'LIKE', '% '.$keyword.'!%') 
       ->orWhere('post', 'LIKE', '% '.$keyword.';%') 
       ->orWhere('post', 'LIKE', '% '.$keyword.',%') 
       ->orWhere('post', 'LIKE', '% '.$keyword.'-%') 
       ->orWhere('post', 'LIKE', '% '.$keyword.'?%'); 
} 

Это отлично работает, если я закомментировать orWhere с вопросом отметка. Однако, когда этот знак вопроса присутствует, он заменяется значением следующего параметра в запросе (значения даты проверяются с другой областью), а конечный параметр запроса не заменяется и остается вопросительным знаком.

Как избежать этого вопросительного знака, чтобы отметить его как буквенный знак вопроса вместо заполнителя?

Что я пробовал:

->orWhere('post', 'LIKE', DB::raw('\'% '.$keyword.'?%\'')) 

->orWhere('post', 'LIKE', '% '.$keyword.DB::raw('?').'%') 

->orWhere(DB::raw('post LIKE \'% '.$keyword.'?%\'') 

->orWhere('post', 'LIKE', '% '.$keyword.'\?%') 

Ничего не сработало. Как мне заставить это работать ?!

+0

[знак вопроса оператор в запросе] (http://stackoverflow.com/a/29964037/1235698) –

+0

Это на самом деле не связаны - я не использую JSONB и Я не пытаюсь использовать оператор вопросительного знака. Я пытаюсь использовать его внутри строкового литерала как буквальный знак вопроса. – jdforsythe

+0

И я не получаю нисходящее. Я довольно много исследовал, чтобы узнать, попробовал ли кто-нибудь еще этого, спросил в IRC, спросил на форумах Laravel, все безрезультатно. Вопрос совершенно ясен. – jdforsythe

ответ

0

Из всего, что я пробовал, и некоторые другие пытались мне помочь, похоже, что вопросительный знак всегда будет заменен на LIKE, однако он не заменяется на REGEXP, поэтому это работает (и, вероятно, быстрее, чем отдельные LIKE поиски так или иначе):

public function scopeContainsKeyword($query, $keyword) { 
    return $query->where('post', 'REGEXP', ' '.$keyword.'[ ?!,;\-\.\'"]'); 
} 
Смежные вопросы