如何仅在 LIKE 查询 Laravel 中找到整个单词?
Posted
技术标签:
【中文标题】如何仅在 LIKE 查询 Laravel 中找到整个单词?【英文标题】:How can I find whole words only in a LIKE query Laravel? 【发布时间】:2018-07-23 10:38:51 【问题描述】:如何在 Laravel 的 Eloquent 中找到 LIKE 查询中的整个单词?
例如,如果有人搜索 SA,以下结果可能会出现 LIKE %sa%:
我叫山姆 我住在南非但我需要一个只返回的搜索:
我住在南非如何在防止 SQL 注入的同时做到这一点?因此,我对原始查询非常谨慎 - 除非提供任何替代方案?
谢谢。
【问题讨论】:
从查询中删除 % 你只会得到 SA 使用=
进行精确匹配,LIKE
用于匹配模式。
如果你用的是eloquent,那么你就不用担心sql注入了
如果 SA 是文本中的单个单词,您可以使用带有单词边界的 RLIKE
。
DB::select('*')->where('place','=', 'SA');
【参考方案1】:
我个人会使用REGEXP
(RLIKE
),结果是这样的:
$place = 'sa';
$res = DB::select( DB::raw("select * from my_table where place REGEXP '[[:<:]]$place[[:>:]]'") );
但这会为通过 SQL 注入的攻击创建一个向量,因此为了清理查询,我们可以执行以下操作:
$place = 'sa';
$results = DB::select( DB::raw("select * from my_table where place REGEXP '[[:<:]]:place[[:>:]]'"), array(
'place' => $place,
));
select()
接受绑定,你可以检查它here :)
编辑
这是select
的签名
public function select($query, $bindings = [], $useReadPdo = true)
【讨论】:
以上是关于如何仅在 LIKE 查询 Laravel 中找到整个单词?的主要内容,如果未能解决你的问题,请参考以下文章
在 Laravel 中使用“LIKE”查询将数组转换为字符串
如何使用 LIKE 关键字和在 laravel 查询生成器中传递变量来制作自定义 orderBy 或 DB::raw(FIELD())
在 Laravel 中使用 Eloquent ORM 使用 LIKE 执行数据库搜索