2014-03-30 27 views
3

如何逃避Laravel/Eloquent中的LIKE条款?例如,Laravel:逃避“LIKE”条款?

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

如果$search包含他们需要%_进行转义。

+0

你'$ search'变量总是/只包含这两个通配符? –

+0

@RahilWazir:不.. ..?它将包含用户键入的任何内容。他们不应该被允许搜索通配符。我只是想在他们面前放一个反斜杠。这是一个单线程,但我希望有一些与数据库无关的东西。 – mpen

回答

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中的转义字符,尽管我不知道你为什么会这样做。

+0

这是否适合您?它不应该是'\\%'和'\\ _'吗? –

+2

@RahilWazir在单引号中使用双斜杠不是必需的。 – mpen

1

对方回答忘掉转义转义字符本身,这里是一个更强大的解决方案:

/** 
* 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 
    ); 
} 
+0

你说得很对。我一定以为它不需要被转义,因为ORM会逃避它,但是LIKE子句实际上有它自己的转义字符,它不一定是'''''。 – mpen