2017-03-16 10 views
1

id = x、またはresname = xxxなど)のようなカスタムDBクエリの場合は、DataTable Service ClassRestaurantDataTable)に(res_idresnameなど)のパラメータを渡すにはどうすればよいですか?Laravel yajra Datatable:カスタムクエリのためのDataTableサービスクラスにパラメータを送信する方法?

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(常にそうです)にパラメータを渡すと、データ可能オブジェクトがそれらをキャッチします。このようrestaurantDataTableで

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

    } 

パラメータを送信した後、編集の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' 
      ] 
     ]); 
} 

今のDataTableのパラメータを送信するパラメータが送信されたかどうかを確認できます。その後あなたがこのようなクエリをフィルタすることができます。

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); 
} 

私はそれが最善の解決策ではありませんが、今の作品を知っています。私はそれが役に立ちそうです。

関連する問題