2016-04-02 8 views
0

私は、キーワードを含む投稿を見つけるためのテキスト列を持つ投稿リソースのスコープを作成しています。彼らは、その後の前にスペースとスペースまたは一般的な句読点(.?!;,-Laravel 4クエリービルダーでリテラルの疑問符を使用するには

がある場合にのみ一致している必要があります。ここに私スコープ方法がありますキーワード:

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

と私はdownvoteを取得しません。誰かがこれを試してみたか、IRCに尋ねられて、Laravelのフォーラムで頼んだことはありません。問題はかなり明確です。 – jdforsythe

答えて

0

私が試したすべてから、いくつかの人が私を助けようとしましたが、LIKEでは常に疑問符が置き換えられますが、REGEXPでは置き換えられません別のLIKE検索よりも速くとにかく):

public function scopeContainsKeyword($query, $keyword) { 
    return $query->where('post', 'REGEXP', ' '.$keyword.'[ ?!,;\-\.\'"]'); 
}