Php Laravel 5.2 w/Yajra datatables,在对象的Read视图中,如何显示父模型的hasMany子模型的所有datatables?
父模型是Fiefdom,hasMany子模型是Fief(但稍后可以并将包括更多)。当导航到/fiefdoms/x时,我希望在fiefdom特定字段之后显示一系列子模型的数据表,每个数据表有一个关系 我的数据表在隔离状态下工作得很好(fief index),但我对如何将它们加载到不专用于单个数据表的页面中有点困惑。我正在使用的一些相关代码片段 FiefController.php(索引) FiefdomController.php(显示) fiefDataTable.phpPhp Laravel 5.2 w/Yajra datatables,在对象的Read视图中,如何显示父模型的hasMany子模型的所有datatables?,php,laravel-5.2,has-many,yajra-datatable,Php,Laravel 5.2,Has Many,Yajra Datatable,父模型是Fiefdom,hasMany子模型是Fief(但稍后可以并将包括更多)。当导航到/fiefdoms/x时,我希望在fiefdom特定字段之后显示一系列子模型的数据表,每个数据表有一个关系 我的数据表在隔离状态下工作得很好(fief index),但我对如何将它们加载到不专用于单个数据表的页面中有点困惑。我正在使用的一些相关代码片段 FiefController.php(索引) FiefdomController.php(显示) fiefDataTable.php <?php n
<?php
namespace App\DataTables;
use App\Models\Fief;
use Form;
use Yajra\Datatables\Services\DataTable;
class FiefDataTable extends DataTable
{
/**
* @return \Illuminate\Http\JsonResponse
*/
public function ajax()
{
return $this->datatables
->eloquent($this->query())
->addColumn('action', 'fiefs.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()
{
$fiefs = Fief::query();
return $this->applyScopes($fiefs);
}
/**
* 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' => 'Bfrtip',
'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 [
'name' => ['name' => 'name', 'data' => 'name'],
'territory_id' => ['name' => 'territory_id', 'data' => 'territory_id'],
'fiefdom_id' => ['name' => 'fiefdom_id', 'data' => 'fiefdom_id'],
'fiefdom_type' => ['name' => 'fiefdom_type', 'data' => 'fiefdom_type'],
'ruler_id' => ['name' => 'ruler_id', 'data' => 'ruler_id'],
'ruler_type' => ['name' => 'ruler_type', 'data' => 'ruler_type'],
'steward_id' => ['name' => 'steward_id', 'data' => 'steward_id'],
'steward_type' => ['name' => 'steward_type', 'data' => 'steward_type']
];
}
/**
* Get filename for export.
*
* @return string
*/
protected function filename()
{
return 'fiefs';
}
}
/fiefs的索引数据表显示得很好,但它在/fiefdoms/x中不起作用。当然,问题是没有数据表信息被发送到视图($datatable未定义)。我应该在控制器中构建并发送它,还是通过ajax加载它?html生成器的东西,也许?记住,我需要包含多个数据表,完成此任务最简单的方法是什么?我是走错了路,还是可以直接将dataTable信息发送到视图?解决方案是使用相关dataTable中的html builder函数 X控制器
use App\DataTables\YDataTable;
...
public function show($id, YDataTable $yDataTable)
{
$dataTable = $yDataTable
->html()
->ajax([
'url' => route('y.index'),
'type' => 'GET',
'data' => 'function(d) { d.key = "value"; }',
]);
return view('whatever', compact('dataTable'));
}
十七
大多数datatable内容都是通过html()函数设置的,数据源是通过ajax()函数定义的。你可以从那里过滤什么的
<?php
namespace App\DataTables;
use App\Models\Fief;
use Form;
use Yajra\Datatables\Services\DataTable;
class FiefDataTable extends DataTable
{
/**
* @return \Illuminate\Http\JsonResponse
*/
public function ajax()
{
return $this->datatables
->eloquent($this->query())
->addColumn('action', 'fiefs.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()
{
$fiefs = Fief::query();
return $this->applyScopes($fiefs);
}
/**
* 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' => 'Bfrtip',
'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 [
'name' => ['name' => 'name', 'data' => 'name'],
'territory_id' => ['name' => 'territory_id', 'data' => 'territory_id'],
'fiefdom_id' => ['name' => 'fiefdom_id', 'data' => 'fiefdom_id'],
'fiefdom_type' => ['name' => 'fiefdom_type', 'data' => 'fiefdom_type'],
'ruler_id' => ['name' => 'ruler_id', 'data' => 'ruler_id'],
'ruler_type' => ['name' => 'ruler_type', 'data' => 'ruler_type'],
'steward_id' => ['name' => 'steward_id', 'data' => 'steward_id'],
'steward_type' => ['name' => 'steward_type', 'data' => 'steward_type']
];
}
/**
* Get filename for export.
*
* @return string
*/
protected function filename()
{
return 'fiefs';
}
}
//various fiefdom fields, and then:
<div class="form-group col-sm-12">
<h2>Fiefs</h2>
@include('fiefs.table')
</div>
//usual container stuff, then
<div class="box-body">
@include('fiefs.table')
</div>
@section('css')
@include('layouts.datatables_css')
@endsection
{!! $dataTable->table(['width' => '100%']) !!}
@section('scripts')
@include('layouts.datatables_js') //various js includes
{!! $dataTable->scripts() !!}
@endsection
use App\DataTables\YDataTable;
...
public function show($id, YDataTable $yDataTable)
{
$dataTable = $yDataTable
->html()
->ajax([
'url' => route('y.index'),
'type' => 'GET',
'data' => 'function(d) { d.key = "value"; }',
]);
return view('whatever', compact('dataTable'));
}
@include('y.table')