如何逃避Laravel/Eloquent中的LIKE
条款?例如,Laravel:逃避“LIKE”条款?
$search = Input::query('sSearch', '');
if($search !== '') {
$paginatedBookings->where('first_name', 'LIKE', '%' . $search . '%');
}
如果$search
包含他们需要%
或_
进行转义。
如何逃避Laravel/Eloquent中的LIKE
条款?例如,Laravel:逃避“LIKE”条款?
$search = Input::query('sSearch', '');
if($search !== '') {
$paginatedBookings->where('first_name', 'LIKE', '%' . $search . '%');
}
如果$search
包含他们需要%
或_
进行转义。
临时解决方法:
$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中的转义字符,尽管我不知道你为什么会这样做。
这是否适合您?它不应该是'\\%'和'\\ _'吗? –
@RahilWazir在单引号中使用双斜杠不是必需的。 – mpen
对方回答忘掉转义转义字符本身,这里是一个更强大的解决方案:
/**
* 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
);
}
你说得很对。我一定以为它不需要被转义,因为ORM会逃避它,但是LIKE子句实际上有它自己的转义字符,它不一定是'''''。 – mpen
你'$ search'变量总是/只包含这两个通配符? –
@RahilWazir:不.. ..?它将包含用户键入的任何内容。他们不应该被允许搜索通配符。我只是想在他们面前放一个反斜杠。这是一个单线程,但我希望有一些与数据库无关的东西。 – mpen