我正在为带有文本列的帖子资源编写范围,以查找包含关键字的帖子。只有先前有空格且后面有空格或典型的标点符号(.?!;,-
)
这是我的范围方法:
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 :(得分:0)
从我尝试过的所有内容以及其他一些尝试帮助我的内容来看,LIKE
似乎总是会替换问号,但是REGEXP
中的问号不会被替换所以这样做(并且可能比单独的LIKE
搜索更快):
public function scopeContainsKeyword($query, $keyword) {
return $query->where('post', 'REGEXP', ' '.$keyword.'[ ?!,;\-\.\'"]');
}