2016-10-11 5 views
1

저는 Laravel을 처음 접했고 다음을 수행하려고 노력했습니다.Laravel eloquent - 여러 열을 연결하여 필터링

  • id
  • first_name
  • last_name

내가 필터링의 옵션으로 사용자 목록을 만들려고 해요 : 나는 다음과 같은 열이있는 간단한 사용자의 테이블이 있습니다. 필터 중 하나는 full_name이지만 사용자의 full_name을 저장하지 않으며 테이블 구조를 수정할 수 없습니다.

나는이에 도착 몇 일 동안

:

$query = \DB::table('users'); 
$query->select(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`) 
     as `full_name`, id'))->having('full_name', 'LIKE',$input['filter_name']); 
$result = $query->get(['*']); 

그러나 그것은 작동하지 않습니다.

Spec : 최신 laravel을 사용하고 있습니다. $users = DB::table('users')->get(); 을 그리고, collections을 사용

+0

정확하게 작동하지 않는 것은 무엇입니까? 오류가 있습니까? laravel의 쿼리 디버깅에 대해 다음을 읽어보십시오. https://scotch.io/tutorials/debugging-queries-in-laravel – haakym

답변

0

나는 그것을 해결했다. 첫 번째 문제는 "%"와일드 카드를 잊어 버렸습니다.

두 번째로 연결 값이 필터로 사용 된 경우 Laravels 페이지 매김은 연결된 값을 사용하여 전체 결과 개수를 계산하려고했습니다. 물론 존재하지 않습니다. 해결책은 다음과 같습니다.

$query = \App\User::whereDeletedAt(null); 
$query->where(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`)'), 'like', '%' . $input['filter_name'] . '%'); 
$query->paginate(15, ['*'], 'page', 1); 
0

어쩌면 대신 쿼리를 modyfing하여 달성하려고이 같은 정상으로 쿼리를 얻을. ->filter(function($key, $value) { return strpos($value['first_name'].' '.$value['last_name'], $to_find) !== false })->all();

1

와일드 카드를 잊어 버린 것 같습니다. 대신이

$query->select(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`) 
    as `full_name`, id'))->having('full_name', 'LIKE',$input['filter_name']); 

시도의

는 :

$query->select(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`) 
    as `full_name`, id'))->having('full_name', 'LIKE', '%' . $input['filter_name'] . '%'); 
+0

예. 나는 너무 늦게 깨달았다. '%'와일드 카드를 잊어 버렸습니다 ... –

+0

'$ query-> paginate (10, ['* '],'page ', 1)'페이지 매김과 함께 사용하면 다음과 같은 오류가 나타납니다 : "열을 찾을 수 없습니다 : 1054 'having 절'(SQL :'deleted_at'이 null이고'users'.'deleted_at'이'full_name' LIKE ad %를 갖는 null 인'users'의 집계로 count (*)를 선택하는 중 'full_name' . 그것은 전체 결과를 계산하려고 시도합니다 ...이 문제에 대한 해결책은 무엇입니까? –

+0

@Olaszka 오류가 명확하다고 생각합니다. 'full_name'이 무엇인지 알지 못합니다. full_name'을 입력하십시오. 다른 문제는 새로운 문제로 업데이트하십시오. –