2017-03-16 1 views
1

id = x 또는 resname = xxx 등의 맞춤형 DB 쿼리의 경우 DataTable Service Class (RestaurantDataTable)에 (res_id, resname 등) 같은 매개 변수를 전달하려면 어떻게해야하나요?Laravel yajra Datatable : 사용자 지정 쿼리를 위해 DataTable Service Class에 매개 변수를 보내는 방법?

RestaurantController :

use App\DataTables\restaurantDataTable; 

    class restaurantController extends AppBaseController 
    { 
     public function index(restaurantDataTable $restaurantDataTable) 
     { 

      return $restaurantDataTable->render('restaurant.index'); 

     } 
    } 

restaurantDataTable :

class restaurantDataTable extends DataTable 
{ 

    /** 
    * @return \Illuminate\Http\JsonResponse 
    */ 
    public function ajax() 
    { 

     return $this->datatables 
      ->eloquent($this->query()) 
      ->addColumn('action', 'restaurant.datatables_actions') 
      ->make(true); 
    } 

    /** 
    * Get the query object to be processed by datatables. 
    * 
    * @return \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder 
    */ 
    public function query() 
    { 

     $restaurants = restaurant::query(); 

     return $this->applyScopes($restaurants); 



    } 

    /** 
    * Optional method if you want to use html builder. 
    * 
    * @return \Yajra\Datatables\Html\Builder 
    */ 
    public function html() 
    { 
     return $this->builder() 
      ->columns($this->getColumns()) 
      ->addAction(['width' => '10%']) 
      ->ajax('') 
      ->parameters([ 
       'dom' => 'Blfrtip', 
       'scrollX' => false, 
       'buttons' => [ 
        'print', 
        'reset', 
        'reload', 
        [ 
         'extend' => 'collection', 
         'text' => '<i class="fa fa-download"></i> Export', 
         'buttons' => [ 
          'csv', 
          'excel', 
          'pdf', 
         ], 
        ], 
        'colvis' 
       ] 
      ]); 
    } 

    /** 
    * Get columns. 
    * 
    * @return array 
    */ 
    private function getColumns() 
    { 
     return [ 
      'res_name' => ['name' => 'res_name', 'data' => 'res_name'], 
      'res_address' => ['name' => 'res_address', 'data' => 'res_address'], 
      'res_state' => ['name' => 'res_state', 'data' => 'res_state'], 
      'res_location' => ['name' => 'res_location', 'data' => 'res_location'], 
      'res_area' => ['name' => 'res_area', 'data' => 'res_area'] 
     ]; 
    } 

    /** 
    * Get filename for export. 
    * 
    * @return string 
    */ 
    protected function filename() 
    { 
     return 'restaurant'; 
    } 
} 

Table.blade.php :

@section('css') 
    @include('layouts.datatables_css') 
@endsection 

{!! $dataTable->table(['width' => '100%']) !!} 


@section('scripts') 
    @include('layouts.datatables_js') 
    {!! $dataTable->scripts() !!} 
@endsection 

내가 public function custom_query($param) {} 또는 public function custom_ajax($param) {} 같은 UsersDataTable 클래스의 기능을 사용자 정의해야합니까?

답변

1

매개 변수를 @ restaurantController 함수 색인에 전달하면 (항상 사용자가 수행합니다.) 데이터 테이블 객체가이를 catch합니다. 당신은 매개 변수가 전송 된 경우 확인할 수 있습니다

public function index(restaurantDataTable $restaurantDataTable) 
    { 
     dd($restaurantDataTable->->request()->all()); 
     return $restaurantDataTable->render('restaurant.index'); 

    } 

전송 매개 변수이 같은 restaurantDataTable에서, html 수정() 함수 후 :

public function html() 
{ 
    $url = 'yourUrl'; 
    if ($this->request()->has("res_id")) { 
     $url = $url."?resId=".$this->request()->get("res_id"); 
    } 

    return $this->builder() 
     ->columns($this->getColumns()) 
     ->addAction(['width' => '10%']) 
     ->ajax($url) 
     ->parameters([ 
      'dom' => 'Blfrtip', 
      'scrollX' => false, 
      'buttons' => [ 
       'print', 
       'reset', 
       'reload', 
       [ 
        'extend' => 'collection', 
        'text' => '<i class="fa fa-download"></i> Export', 
        'buttons' => [ 
         'csv', 
         'excel', 
         'pdf', 
        ], 
       ], 
       'colvis' 
      ] 
     ]); 
} 

이제 데이터 테이블 매개 변수를 보낼 것입니다. 그 후 다음과 같이 검색어를 필터링 할 수 있습니다.

public function ajax() 
{ 
    return $this->datatables 
     ->eloquent($this->query()) 
     ->addColumn('action', 'restaurant.datatables_actions') 
     ->filter(function ($query) {   
      if ($this->request()->has("resId")) { 
       $query->where("res_id", $this->request()->get("resId")); 
      } 
     }) 
     ->make(true); 
} 

나는 그것이 최선의 해결책은 아니지만 지금은 효과가 있다는 것을 알고 있습니다. 도움이되기를 바랍니다.

관련 문제