2017-02-27 1 views
1

내 모델에 사용하려는 다른 필터가 있지만 모두 선택 사항입니다.여러 진입 점이있는 쿼리 작성기

if($foo) { 
    $model = Model::where('id', 1); 
} 
if($bar) { 
    $model = $model->where('age', 3); 
} 

이 코드는 첫 번째 문이 성공하면 실행됩니다.

$model = Model::where('id', '<>', -1); 
if($foo) { 
    $model->where('id', 1); 
} 
if($bar) { 
    $model->where('age', 3); 
} 

이 작동,하지만 그것은 더러운 :(

그래서 그것은 variabel에 모델을 저장할 수있다 그래서 나는 내부의 모든 정적 전화를 걸 수없는 경우 문?

답변

2

https://laravel.com/api/5.4/Illuminate/Database/Eloquent/Model.html#method_query

https://laravel.com/api/5.4/Illuminate/Database/Query/Builder.html#method_when

Model::query()->when($foo, function ($query) { 
    $query->where('id', 1); 
})->when($bar, function ($query) { 
    $query->where('age', 3); 
}); 
+0

나는 단지'ID를 <> 추가 -1' 그래서 여전히 더러운 – mimo

+1

'모델 : 쿼리()'쿼리를 얻을 그래서 나는 처음에 정적 호출이 빌더 –

+0

만약 당신이 첫 번째 행으로 교체 것이 올바른 대답 으로이 답변을 설정합니다. – mimo

1

where 함수에서 필터를 만들 수 있습니다. 이렇게하면 모두 함께 그룹화됩니다. 예를 들어

는 :

$models = Model::where(function ($query) use ($request) { 
    $query->where('id', '<>' -1); 

    if ($request->has('id') 
     $quer->where('id', $request->id); 

    if ($request->has('age')) 
     $query->where('age', $request->age); 

})->get();