질문을 삭제하지 말아주세요.!
 
2
1
0
Member::select('IDX','CONCAT(FIRST_NAME, ",", LAST_NAME) AS NAME')->limit(3)->get();

위와 상티 사용하면 QueryException 오류가 발생합니다.

Member::select('IDX', DB::raw('CONCAT(FIRST_NAME, "", LAST_NAME) AS NAME'))->limit(3)->get();

위와 같이 DB::raw를 사용 하면 정상적으로 데이터를 불러옵니다.

QueryException는 왜 나는건가요??
그리고 DB::raw는 어떤경우에 사용하는건가요?
    CommentAdd your comment...

    2 answers

    1.  
      1
      0
      -1

      제 생각에 문장중에 있는 CONCAT문장 중에 있는 큰따옴표(")를 파싱하면서 SQL오류가 나왔을 수도 있겠네요.

      DB:raw()는 님의 경우 처럼, SELECT 문에서 컬럼의 값을 변환하거나 COUNT()와 같이 값을 계산하여야 할 경우, 입력된 SQL문을 문자열로 인식하도록 할 경우 사용 됩니다. 참고로 selectRaw()함수도 비슷한 기능을 합니다.

      select()에서 DB:raw()의 사용법

       DB::table('someTable')
      ->selectRaw('count(*), min(some_field) as someMin, max(another_field) as someMax')
      ->get();

      selectRaw() 사용법

      DB::table('someTable')->select(
      array(
              DB::raw('min(some_field) as someMin'),
              DB::raw('max(another_field) as someMax'),
              DB::raw('COUNT(*) as `count`')
          )
      )->get()

      두 문장의 경과는 같습니다.

      DB:raw()는 Where절의 복잡한 조건을 주거나 할 경우에도 많이 사용됩니다. where() 함수에서 사용할 때는 파라메터 형식에 맞도록 사용하여야 합니다. 전체 문장을 사용할 경우는 whereRaw() 사용하여야 합니다.

      where()에서 DB:raw()의 사용법

      ->where(DB::raw('DATE(date_column)'), '>', '2017-01-01')

      whereRaw()사용법

      ->whereRaw("DATE(date_column) > '2017-01-01'")

      개념은 알고 있었지만, 질문에 대답하려고 자료를 찾아보니, 저도 공부가 많이 되네요. 질문 감사합니다.

      참고:

      http://laraveldaily.com/select-with-dbraw-make-your-database-work/

      https://stackoverflow.com/questions/34408900/laravel-selectraw-vs-dbraw

      https://stackoverflow.com/questions/43110511/whereraw-vs-dbraw-in-laravel

      1. 박순재

        덕분에 저도 공부가 많이 되었습니다.

        자세한 설명 감사합니다.



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

      유효해 보이는데 왜 그랬을까요? Member::select('IDX','CONCAT(FIRST_NAME, ",", LAST_NAME) AS NAME')->limit(3)→toSql(); 로 SQL 쿼리로 바꿔보시고, 출력된 쿼리문을 DB에서 직접 실행해 보시면 원인을 알 수 있을 듯 합니다.

      1. 박순재

        감사합니다.

        DB::raw를 사용 하지 않으면

        `CONCAT(FIRST_NAME, " ", LAST_NAME) AS NAME`

        요렇게 출력되네요

        DB::raw 사용시

        CONCAT(FIRST_NAME, " ", LAST_NAME) AS NAME

        요렇게 출력됩니다.

      CommentAdd your comment...