2016-11-28 320 views
1

我在一個項目中使用Laravel 5.1和雄辯的ORM。我需要查詢數據庫以查找使用其名稱或部分名稱的人員。如何使用whereRaw()來清理Laravel查詢?

如果一個人名爲約翰Doelington,我希望所有的搜索詞johndoelinjohn doe發現約翰Doelington。但是,名字和姓氏存儲在不同的列中。目前我使用此查詢:

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

看着我看到了很多錯誤的日誌 - 每次有'象徵它打破了查詢時間。看起來我在whereRaw()函數的安全區域之外,有人可以通過上帝知道SQL是什麼。

我應該怎麼做嗎?

我應該手動淨化輸入?如果是這樣,我該怎麼辦?刪除'還有什麼?而如果查詢實際上必須包含'符號呢?

也許有執行此查詢一個更安全的方式?在使用whereRaw()時,我可以使用Eloquent但傳遞參數來查詢PDO樣式嗎?

如果它使差別,我使用的是MySQL數據庫。

我知道我可以爲全名創建連接列,但是在使用此備用連接之前,我正在尋找一個Eloquent解決方案。

回答

4

source code,很明顯,whereRaw的第二個參數接受陣列綁定,所以你可以寫你的查詢爲:

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

您也可以嘗試Full-Text search