2016-10-11 90 views
1

我是Laravel的新手,我試圖執行以下操作。我有以下的列一個簡單的用戶表:Laravel雄辯 - 通過多列連接過濾

  • id
  • first_name
  • last_name

我打算做一個用戶列表與過濾的選項。其中一個篩選器是full_name,但我不存儲full_name的用戶,並且我無法修改表結構。

過了幾天,我到這一點:

$query = \DB::table('users'); 
$query->select(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`) 
     as `full_name`, id'))->having('full_name', 'LIKE',$input['filter_name']); 
$result = $query->get(['*']); 

但它不工作。

規格:我正在使用最新的laravel。

+0

什麼是不正確的工作?你有錯誤嗎?閱讀laravel中的調試查詢:https://scotch.io/tutorials/debugging-queries-in-laravel – haakym

回答

0

我解決它。第一個問題是,我忘記了「%」通配符。

第二個用於連接的值作爲過濾器,則Laravels分頁會嘗試通過使用該連接的值來計算總體結果計數。當然它不存在。解決辦法是:

$query = \App\User::whereDeletedAt(null); 
$query->where(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`)'), 'like', '%' . $input['filter_name'] . '%'); 
$query->paginate(15, ['*'], 'page', 1); 
0

也許,而不是試圖通過modyfing查詢來實現它,得到的查詢像正常: $users = DB::table('users')->get(); 然後,用collections->filter(function($key, $value) { return strpos($value['first_name'].' '.$value['last_name'], $to_find) !== false })->all();

1

我想你在LIKE語句中忘記了通配符。

而是這個

$query->select(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`) 
    as `full_name`, id'))->having('full_name', 'LIKE',$input['filter_name']); 

嘗試:

$query->select(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`) 
    as `full_name`, id'))->having('full_name', 'LIKE', '%' . $input['filter_name'] . '%'); 
+0

是的。我意識到這太晚了。我忘了'%'通配符... –

+0

如果我用paginate'$ query-> paginate(10,['*'],'page',1)'使用它,我得到以下錯誤:「Column not found :1054'having clause'中的未知列'full_name'(SQL:select count(*)as'users'中的集合,其中'deleted_at'爲空,'users'.'leleted_at'爲null,具有'full_name' LIKE ad% 它試圖計算整體結果...任何解決方案? –

+0

@Olaszka我認爲這個錯誤是明確的,它不知道'full_name'是什麼,我認爲你忘了'... as full_name'。否則用新問題更新問題。 –