如何在Laravel 4查询构建器中使用文字问号

时间:2016-04-02 17:30:57

标签: php 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.'\?%')

没有任何效果。我如何让它工作?!

1 个答案:

答案 0 :(得分:0)

从我尝试过的所有内容以及其他一些尝试帮助我的内容来看,LIKE似乎总是会替换问号,但是REGEXP中的问号不会被替换所以这样做(并且可能比单独的LIKE搜索更快):

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