질문을 삭제하지 말아주세요.!
 
1
0
-1

검색어를 폼값으로 받아와서 검색 결과를 출력하는 쿼리를 만들려고 하고 있습니다.

아래처럼 하니까 오류가 많이 발생하더라구요.

어떻게 쿼리를 구성해야 할까요?

// 오류 발생하는 쿼리 
 
// 검색키워드를 배열로 바꾸어서 루프로 처리
$keywords = explode(',', $req->keyword );
 
// Resource는 resource 테이블 관련 모델
$data = Resource::whereNotNull('resource.title');

// 루프로 검색어별로 검색된 쿼리 합치기
foreach ( $keywords as $keyword ) {
$data = Resource::join('category', 'category.id','=','resource.res_id')
->orWhere('resource.title', 'like', "%$keyword%")
->orWhere('resource.sub_title', 'like', "%$keyword%")
->orWhere('resource.writer', 'like', "%$keyword%")
->orWhere('resource.editor', 'like', "%$keyword%")
->orWhere('resource.summary', 'like', "%$keyword%")
->orWhere('resource.provider', 'like', "%$keyword%")
->orWhere('resource.user_name', 'like', "%$keyword%")
->select('resource.*', 'category.cat_name')
->union($data);
}

// 페이지네이션 처리
$data = $data->paginate(20);
    CommentAdd your comment...

    3 answers

    1.  
      1
      0
      -1

      request 로 넘어온 검색 키워드를 처리하려면 query scope 을 쓰시는게 코드가 더 깔끔해 지지 않을까 생각됩니다.

      (참고: https://www.lesstif.com/pages/viewpage.action?pageId=27295884)

       

      쿼리스코프는 모델(Resource.php ?) 파일에 정의해 주시면 됩니다.

      Resource.php
       class Resource extends Model {
      
         /**
          * Scope a query to only include active users.
          *
          * @param \Illuminate\Database\Eloquent\Builder $query
          * @return \Illuminate\Database\Eloquent\Builder
          */
         public function scopeQueryWithParameter($query, \App\Http\Requests\Request $request)
         {
            if (!empty($request->get('title')))
               $query = $query->where('resource.title', 'like', '%'. $request->get('title'). '%');
      
            if (!empty($request->get('sub_title')))
               $query = $query->where('resource.sub_title', 'like', '%'.$request->get('sub_title') .'%');
      
            if (!empty($request->get('writer')))
               $query = $query->where('resource.writer', 'like', '%'.$request->get('writer') .'%');
      
            return $query;
         }
      }

       

      사용은 아래처럼 하시면 되고요.

      $data = Resource::QueryWithParameter($req)->paginate(20);
      1. 이덕형

        오!! 감사합니다!!

      CommentAdd your comment...
    2.  
      1
      0
      -1

      두분 모두 감사합니다. 결국 raw 쿼리로 해결했습니다.

        CommentAdd your comment...
      1.  
        1
        0
        -1

        비교 대상 텍스트 컬럼이 꽤 많네요. MySQL을 쓰신다면 풀텍스트 인덱스도 고려해 보세요.

        https://github.com/appkr/l5code/blob/master/app/Http/Controllers/ArticlesController.php#L53

          CommentAdd your comment...