我在项目中使用Laravel 5.1和Eloquent ORM。我需要查询数据库以查找使用其名称或部分名称的人。
如果某人名为John Doelington,我希望所有搜索字词john
,doelin
,john doe
找到John Doelington。但是,名字和姓氏存储在不同的列中。目前我正在使用此查询:
$people = Person::whereRaw(
'CONCAT(first_name, \' \', last_name)
LIKE \'%'.$search.'%\'')
->get();
查看日志我发现很多错误 - 每次有'
符号时,它都会破坏查询。似乎我在whereRaw()
函数的安全区之外,有人可以通过上帝知道SQL的内容。
我该怎么办?
我应该手动清理输入吗?如果是这样,我该怎么办?删除'
还有什么?如果查询实际上必须包含'
符号?
也许有一种更安全的方式来执行此查询?我可以使用Eloquent但是在使用whereRaw()
?
如果它有所不同,我正在使用MySQL作为数据库。
我知道我可以为全名创建一个连接列,但是我在使用此回退之前首先寻找一个Eloquent解决方案。
答案 0 :(得分:6)
从source code开始,whereRaw
的第二个参数显然接受数组绑定,因此您可以将查询编写为:
$search = "%{$search}%";
$people = Person::whereRaw("(CONCAT(first_name,' ',last_name) like ?)", [$search])
->get();
您也可以尝试Full-Text search。