我有一个小型搜索表单,允许用户通过id
或first_name,last_name
搜索他的客户。
在我的数据库中fist_name
和last_name
位于两个单独的列中,因此当我尝试按名称搜索客户端时,我需要使用检查该列的查询。
这是我的代码:
//Recupero l'utente corrente
$current_user = Auth::user()->id;
//Preparo la query
$query = DB::table('clients');
//Recupero l'eventuale nome e ID di ricerca cliente
$client_id = Input::get('client_id');
$client_name = Input::get('client_name');
//Controllo se devo fare una ricerca per ID
if( is_numeric($client_id) )
{
$query->where('id', '=', $client_id);
}
elseif( trim($client_name) != "" )
{
//Controllo se invece ho il nome
$query->where('nome', 'LIKE', "%$client_name%")->orWhere('cognome', 'LIKE', "%$client_name%");
}
//Recupero i clienti
$data['clients'] = $query->where('id_agente', $current_user)->paginate(10);
第一个if
将检查用户是否按ID
选择客户端,而第二个需要检查名称和last_name。
问题在于,在第二种情况下,忽略了最后一个where
并返回表中与输入匹配的所有结果,因此我可以看到其他用户的数据。
如何修改我的代码,以便始终考虑where('id_agente', $current_user)
?
答案 0 :(得分:0)
在elseif
部分中,只需替换以下行:
$query->where('nome', 'LIKE', "%$client_name%")->orWhere('cognome', 'LIKE', "%$client_name%");
有了这个:
$query->where(function($q) use ($client_name) {
$q->where('nome', 'LIKE', "%$client_name%")
->orWhere('cognome', 'LIKE', "%$client_name%");
});
答案 1 :(得分:0)
将封闭传递给where()
中的elseif
。
elseif( trim($client_name) != "" )
{
$query->where(function($subQuery) use ($client_name){
$subQuery->where('nome', 'LIKE', "%$client_name%");
$subQuery->orWhere('cognome', 'LIKE', "%$client_name%");
}};
}
$data['clients'] = $query->where('id_agente', $current_user)->paginate(10);
或者......简化整个脚本:
$client_id = trim(Input::get('client_id'));
$client_name = trim(Input::get('client_name'));
if(empty($client_id) && empty($client_id))
return false;
$data['cleints'] = DB::table('clients')
->where((!empty($client_id)) ? function($q) use ($client_id){
$q->where('id', '=', $client_id)->first();
} : function($q) use ($client_name) {
$q->where('nome', 'LIKE', "%$client_name%");
$q->orWhere('cognome', 'LIKE', "%$client_name%");
})->where('id_agente', Auth::user()->id)
->paginate(10);