2017-05-11 3 views
0

Eloquent Model을 사용하는 클래스를 작성하고 datatable에 대한 JSON을 출력하기 위해 조작 한 클래스를 작성했습니다. 데이터 테이블은 POST 요청을 통해 서버 측 처리를 사용합니다.where(), orderBy() 등의 Eloquent datatables

Datatable::make($_POST, new User()); 

그래서 User이 인스턴스의 웅변 모델 :

여기
namespace App\Helpers; 

class Datatable { 
    public static $request; 
    public static $model; 
    public static $records_total; 
    public static $records_filtered; 

    static function make ($request, $model) { 
     self::$request = $request; 
     self::$model = $model; 
     self::setRecordsTotal(); 
     self::filter(); 
     self::setRecordsFiltered(); 
     self::orderLimit(); 
     self::renderJson(); 
    } 

    // set total record count 
    static function setRecordsTotal() { 
     self::$records_total = self::$model->count(); 
    } 

    // filter by search query 
    static function filter() { 
     if (!empty(self::$request['search']['value'])) { 
      foreach (self::$request['columns'] as $column) { 
       if ($column['searchable'] == 'true') { 
        self::$model->where($column['data'], 'LIKE', '%'.self::$request['search']['value'].'%'); 
       } 
      } 
     } 
    } 

    // set filtered record count 
    static function setRecordsFiltered() { 
     self::$records_filtered = self::$model->count(); 
    } 

    // apply order by & limit 
    static function orderLimit() { 
     self::$model->orderBy(self::$request['columns'][self::$request['order'][0]['column']], self::$request['order'][0]['dir']); 
     self::$model->skip(self::$request['start'])->take(self::$request['length']); 
    } 

    // render json output 
    static function renderJson() { 
     $array = []; 
     $array['draw'] = self::$request['draw']; 
     $array['recordsTotal'] = self::$records_total; 
     $array['recordsFiltered'] = self::$records_filtered; 
     $array['data'] = []; 
     $results = self::$model->get(); 

     foreach ($results as $result) { 
      $array['data'][] = $result->toArray(); 
     } 

     echo json_encode($array); 
    } 
} 

내가 클래스를 호출하는 방법입니다 : 여기

는 클래스입니다.

이제 데이터 테이블의 초기 렌더링이 효과적입니다. 그러나 시도하거나 검색하거나 주문할 때 filter()orderLimit() 메서드 내의 코드가 적용되지 않는 것처럼 보입니다. 정확히 동일한 결과가 똑같은 순서로 튀어 나오기 때문입니다.

where(), orderBy() 등이 모델에 제대로 적용되지 않는 이유는 무엇입니까?

+0

정적 바인딩의 원인 일뿐입니다. 확실하지 않지만 정적으로 $ model을 사용하지 않는 메소드를 다시 작성할 수 있습니다 –

+0

$ 모델 인수로 파싱 하시겠습니까? – b0ne

+0

이것이 전문 개발자들이 Laravel이 절차 적 프레임 워크라고 말한 이유입니다. –

답변

0

알아 냈어. 예를 들어 make() 방법으로 모델에 ::query()을 사용해야 만했습니다. 예 :

self::$model = $model::query().