如何逃避Laravel / Eloquent中的LIKE
条款?如,
$search = Input::query('sSearch', '');
if($search !== '') {
$paginatedBookings->where('first_name', 'LIKE', '%' . $search . '%');
}
如果$search
包含%
或_
,则需要对其进行转义。
答案 0 :(得分:12)
另一个答案是忘记逃避转义字符本身,这是一个更强大的解决方案:
/**
* Escape special characters for a LIKE query.
*
* @param string $value
* @param string $char
*
* @return string
*/
function escape_like(string $value, string $char = '\\'): string
{
return str_replace(
[$char, '%', '_'],
[$char.$char, $char.'%', $char.'_'],
$value
);
}
答案 1 :(得分:2)
临时解决方案:
$search = Input::query('sSearch', '');
if($search !== '') {
$escSearch = Util::escapeLike($search);
$paginatedBookings->where('first_name', 'LIKE', '%' . $escSearch . '%');
$paginatedBookings->orWhere('last_name', 'LIKE', '%' . $escSearch . '%');
}
class Util {
public static function escapeLike($str) {
return str_replace(['\\', '%', '_'], ['\\\\', '\%', '\_'], $str);
}
}
我希望有一些与数据库无关且更强大的东西。我认为你可以改变MySQL中的转义字符,虽然我不知道你为什么会这样做。
答案 2 :(得分:0)
这个问题尤其出现在我们想查询多态相关表时。例如,我想通过查询App\Example\Files
来找到一个名为like
的列值。但是因为反斜杠它失败了。
在测试时,我发现 Laravel 端和 mysql 端都需要“4 个反斜杠”。使查询正常工作。
我也用toSql()方法验证了这一点。结果,mysql查询的输出是这样的,并且成功了:
select `file` from `examples` where file like '%App\\\\Example\\\\Files%'
我写了一个小辅助函数来做反斜杠修正
之前:
DB::table('examples')
->select('file')
->whereRaw("state like '%App\Example\Files%'")
->toSql();
错误输出:
select `file` from `examples` where file like '%App\Example\Files%'
之后
function handle_backslash($value) :string {
return str_replace('\\', '\\\\\\\\', $value);
}
DB::table('examples')
->select('file')
->whereRaw("file like '%" . handle_backslash('App\Example\Files') . "%'")
->toSql();
正确的输出:
select `file` from `examples` where file like '%App\\\\Example\\\\Files%'