如何仅在 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:如何仅在模型关系存在时才查询模型关系

在 Laravel 中使用 Eloquent ORM 使用 LIKE 执行数据库搜索

带有“LIKE”语句的雄辩查询在 Laravel 6 中不起作用

如何使用 Eloquent 在 Laravel 中开始查询?