Laravel - clausole不能按预期工作

时间:2014-08-25 16:07:12

标签: laravel-4

我有一个小型搜索表单,允许用户通过idfirst_name,last_name搜索他的客户。

在我的数据库中fist_namelast_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)

2 个答案:

答案 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);