【问题标题】:Laravel Datatables - Multiple tables on one viewLaravel 数据表 - 一个视图上的多个表
【发布时间】:2018-01-19 20:37:03
【问题描述】:

我正在使用 laravel 5.4 和最新版本的 yajra/laravel-datatables 作为服务。

我可以很好地处理页面上的一个数据表。我想创建一个不相关表的仪表板。用户、产品、预订等。

我希望我的控制器看起来像这样:

public function index(ProductsDataTable $productDatatable, UsersDataTable $userDatatable)
{    
    $user = Auth::user();

    $products = $user->products;

    return view('admin.dashboard', compact('products', 'user', 'productDatatable', 'userDatatable'));
}

在我的刀片上做

@section('content')
{!! $productDatatable->table() !!}
{!! $userDatatable->table() !!}
@endsection

@push('scripts')
{!! $dataTable->scripts() !!}
@endpush

但是这显然行不通。我不确定如何继续。

我尝试为每个数据表创建一个路由,但不知道如何从我的仪表板控制器中引用它。

【问题讨论】:

    标签: php laravel datatables


    【解决方案1】:

    我确信有一种更好的方法可以在一个视图中实现多个表,但这是我在查看 this 后得出的结论。评论/改进将不胜感激。

    控制器

    控制器将在index() 方法中呈现表一次,但将从getUsers() 方法或getProducts() 方法中获取数据。

    // DashboardController.php
    
    public function index(UsersDataTable $usersDataTable, ProductsDataTable $productsDataTable)
    {
        return view('dashboard.index', [
            'usersDataTable' => $usersDataTable->html(),
            'productsDataTable' => $productsDataTable->html()
        ]);
    }
    
    //Gets Users JSON
    
    public function getUsers(UsersDataTable $usersDataTable)
    {
        return $usersDataTable->render('admin.dashboard');
    }
    
    //Gets Products JSON
    
    public function getProducts(ProductsDataTable $productsDataTable)
    {
        return $productsDataTable->render('admin.dashboard');
    }
    

    路线

    添加两个额外的路由,用于获取用户和项目数据。

    // web.php
    
    Route::get('/', 'DashboardController@index')->name('dashboard.index');
    Route::get('projects', 'DashboardController@getProjects')->name('dashboard.projects');
    Route::get('users', 'DashboardController@getUsers')->name('dashboard.users');
    
    

    数据表服务类

    对于UsersDataTableProductsDataTable 服务类,包括我们在上面创建的相关路由。

    // UsersDataTable.php
    
    public function html()
    {
        return $this->builder()
                    ->minifiedAjax( route('dashboard.users') );
    }
    

    查看

    // dashboard.blade.php
    
    @section('content')
    
       {!! $productsDataTable->table() !!}
       {!! $usersDataTable->table() !!}
    
    @endsection
    
    @push('scripts')
    
       {!! $productsDataTable->scripts() !!}
       {!! $usersDataTable->scripts() !!}
    
    @endpush
    

    【讨论】:

    • 完美!谢谢老哥
    【解决方案2】:

    向包的创建者提交了一个问题。这是他的回应:

    不幸的是,DataTable 服务类旨在处理单个实例。但是,我认为我们可以通过在我们的请求中添加额外的查询参数来解决它,以便我们确定正在请求哪个类来处理请求。

    也许像下面这样:

    public function index(ProductsDataTable $productDatatable, UsersDataTable $userDatatable)
    {    
    if (request()->has('product') {
        return $productDatatable->render('view');
    }
    
    if (request()->has('user') {
        return $productDatatable->render('view');
    }
    
    $user = Auth::user();
    
    $products = $user->products;
    
    return view('admin.dashboard', compact('products', 'user', 'productDatatable', 'userDatatable'));
    }
    

    【讨论】:

      【解决方案3】:

      第 1 步: 在 web.php/route.php' 中定义一个路由 '/home-page'(取决于你使用的 laravel 版本),它返回名为 'dt.blade.php' 的视图。 (我们将在第 4 步中创建此视图)

      i.e. Route::get('/home-page', function(){
      
      return view('dt');
      
      });
      

      第 2 步: 假设您想在“dt.blade.php”视图中显示两个数据表。 (第一个数据表显示一所学校的所有学生,而另一个数据表显示一所学校的所有班级)

      为此,您需要在 '/home-page' 路由的回调函数中创建两个 Builder 实例('Builder' 类属于 DataTables 包)并将它们传递给 'dt.blade.php' 视图。即

      Route::get('/home-page', function() {
      
          $student_dt = app(Builder::class)->columns(['id', 'student_name'])->ajax('/show-students-datatable')->setTableId('t1');
      
      
          $classes_dt = app(Builder::class)->columns(['id', 'class_name'])->ajax('show-classes-datatable')->setTableId('t2');
      
          return view('dt', compact('student_dt', 'classes_dt'));
      
      });
      

      第 3 步 现在在 web.php/route.php 文件中再定义两个路由:

      Route::get('/show-students-datatable', function () {
      
          return datatables(App\Student::query()->select(['id', 'student_name']))->toJson();
      
      });
      
      Route::get('/show-classes-datatable', function () {
      
          return datatables(App\Class::query()->select(['id', 'class_name'])))->toJson();
      
      });
      

      第 4 步 定义“db.blade.php”视图,该视图显示在步骤 1 中传递给它的两个数据表。

      @extends('layouts.master')
      
          @section('content')
      
              {{ $student_dt->table() }}
              {{ $classes_dt->table() }}
      
          @endsection
      
          @push('scripts')
      
              {{$student_dt->scripts()}}
              {{$classes_dt->scripts()}}
      
          @endpush
      

      【讨论】:

      • 请为您通过代码完成的解释提供一些描述。
      猜你喜欢
      • 1970-01-01
      • 2016-02-19
      • 2017-02-26
      • 2018-04-03
      • 1970-01-01
      • 2021-02-06
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多