2017-12-13 12 views
0

: 이제Laravel -의 열 배열을 전달 나는이 같은 검색 쿼리가 '어디에'조항

$data = User::where('first_name', 'like', '%'.$query.'%') 
    ->orWhere('last_name', 'like', '%'.$query.'%') 
    ->get(); 

을, 나는 많은 모델, 다른 열 이름을 가진 각이있다. 이 같은

// User 
public static function searchableFields() 
{ 
    return ['first_name', 'last_name']; 
} 

// Some other model 
public static function searchableFields() 
{ 
    return ['name', 'description']; 
} 

을 그리고 공유 컨트롤러의 검색 로직을 넣어 :

$data = $classname:: 
    where($classname::searchableFields(), 'like', '%'.$query.'%') 
    ->get(); 

어떻게 이것을 달성 할 수 대신 모든 컨트롤러에 search() 함수를 정의, 나는이 작업을 수행 할 수?

고마워요.

+0

일반적으로 열 이름은 동적 SQL이 아닌 쿼리의 매개 변수가 될 수 있습니다. 몇 가지 열을 나열하면 왜 문제가됩니까? –

답변

1

.

$data = $classname::where(function ($query) use ($classname) { 
    foreach ($classname::searchableFields() as $field) 
     $query->orWhere($field, 'like', '%' . $query . '%'); 
})->get(); 
+0

감사합니다 Jerodev! 그게 바로 제가 찾던 것입니다. 그것은 매력처럼 작동합니다! – Oscar

+0

기꺼이 도와 드리겠습니다. 이것을 당신의 질문에 대한 해결책으로 표시하는 것을 고려하여 다른 사용자들도 이것을 찾을 수 있습니다. – Jerodev

+0

@Oscar 그러면 –

0

다음과 같이 시도해 볼 수 있습니다.

// 컨트롤러

function getIndex(Request $request) 
{ 
    $this->data['users'] = User::orderBy('first_name','asc')->get(); 

    if ($request->has('keyword')) { 
     $results    = User::search($request->keyword); 
     $this->data['users'] = collect([$results])->collapse()->sortBy('first_name'); 
    } 
} 

// 모델 당신은 필드 돌이 할 수있는 하나의하여 설득력 쿼리 하나에 추가

function search($keyword) 
{ 
    $results  = []; 
    $search_list = ['first_name','last_name']; 
    foreach ($search_list as $value) 
    { 
     $search_data = User::where($value,'LIKE','%'.$keyword.'%')->get(); 
     foreach ($search_data as $search_value) { 
      $exist = 0; 
      if (count($results)) { 
       foreach ($results as $v) { 
        if ($search_value->id == $v->id) { 
         $exist++; 
        } 
       } 
       if ($exist == 0) { 
        $results[] = $search_value; 
       } 
      } else{ 
       $results[] = $search_value; 
      } 
     } 
    } 
    return $results; 
} 
+0

그러나 이것은 키워드가있는만큼 많은 쿼리를 실행하며 많은 불필요한 코드가 있습니다. – Jerodev

1

나는 그 범위를 사용합니다.

당신은 모든 모델을 확장해야합니다 (이 모델은 설득력 모델을 확장한다)이 모델에서 당신은 그런 방법을 추가해야합니다 기본 모델을 만들 수 있습니다

:이 같은 검색을 할 수

이제
public function scopeMatchingSearch($query, $string) 
{ 
    $query->where(function($q) use ($string) { 
     foreach (static::searchableFields() as $field) { 
      $q->orWhere($field, 'LIKE', '%'.$string.'%'); 
     } 
    }); 
} 

를 : 이 방법에 $string 매개 변수가 matchingSearch로하게 전달 $query 매개 변수 -

$data = User::matchingSearch($query)->get(); 

그냥 혼란을 방지 할 수 있습니다.

+0

안녕하세요, Marcin, 이것은 훌륭한 접근 방식이며 잘 작동합니다. – Oscar