Laravel:逃避“LIKE”条款?

时间:2014-03-30 20:09:13

标签: php laravel laravel-4

如何逃避Laravel / Eloquent中的LIKE条款?如,

$search = Input::query('sSearch', '');
if($search !== '') {
    $paginatedBookings->where('first_name', 'LIKE', '%' . $search . '%');
}

如果$search包含%_,则需要对其进行转义。

3 个答案:

答案 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);
    }
}

reference

我希望有一些与数据库无关且更强大的东西。我认为你可以改变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%'