如果使用whereRaw(),我应该如何清理Laravel查询?

时间:2016-11-28 13:35:40

标签: laravel eloquent

我在项目中使用Laravel 5.1和Eloquent ORM。我需要查询数据库以查找使用其名称或部分名称的人。

如果某人名为John Doelington,我希望所有搜索字词johndoelinjohn doe找到John Doelington。但是,名字和姓氏存储在不同的列中。目前我正在使用此查询:

$people = Person::whereRaw(
                     'CONCAT(first_name, \' \', last_name) 
                      LIKE \'%'.$search.'%\'')
                 ->get();

查看日志我发现很多错误 - 每次有'符号时,它都会破坏查询。似乎我在whereRaw()函数的安全区之外,有人可以通过上帝知道SQL的内容。

我该怎么办?

我应该手动清理输入吗?如果是这样,我该怎么办?删除'还有什么?如果查询实际上必须包含'符号?

,该怎么办?

也许有一种更安全的方式来执行此查询?我可以使用Eloquent但是在使用whereRaw()

时传递参数以PDO样式进行查询

如果它有所不同,我正在使用MySQL作为数据库。

我知道我可以为全名创建一个连接列,但是我在使用此回退之前首先寻找一个Eloquent解决方案。

1 个答案:

答案 0 :(得分:6)

source code开始,whereRaw的第二个参数显然接受数组绑定,因此您可以将查询编写为:

$search = "%{$search}%";
$people = Person::whereRaw("(CONCAT(first_name,' ',last_name) like ?)", [$search])
                 ->get();

您也可以尝试Full-Text search