0

父模型是 Fiefdom,hasMany 子模型是 Fief(但以后可以包含更多)。当导航到 /fiefdoms/x 时,我希望显示在特定于 fiefdom 的字段之后包括一系列用于子模型的数据表,每个数据表对应一个 hasMany 关系。

我的数据表在隔离中工作得很好(封地索引),但我对如何将它们加载到不专用于单个数据表的页面中有些困惑。我正在使用的一些相关代码片段......

FiefController.php(索引)

/**
 * Display a listing of the Fief.
 *
 * @param FiefDataTable $fiefDataTable
 * @return Response
 */
public function index(FiefDataTable $fiefDataTable)
{
    return $fiefDataTable->render('fiefs.index');
}

FiefdomController.php (显示)

/**
 * Display the specified Fiefdom.
 *
 * @param  int $id
 *
 * @return Response
 */
public function show($id)
{
    $fiefdom = $this->fiefdomRepository->findWithoutFail($id);

    if (empty($fiefdom)) {
        Flash::error('Fiefdom not found');

        return redirect(route('fiefdoms.index'));
    }

    return view('fiefdoms.show')
        ->with('fiefdom', $fiefdom);
}

fiefDataTable.php

<?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';
    }
}

fiefdom/fields.blade.php(在“fiefdoms.show”中引用)包括:

//various fiefdom fields, and then:
<div class="form-group col-sm-12">
    <h2>Fiefs</h2>
    @include('fiefs.table')
</div>

封地/index.blade.php

//usual container stuff, then

<div class="box-body">
    @include('fiefs.table')
</div>

封地/table.blade.php

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

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

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

/fiefs 的索引数据表显示得很好,但它在 /fiefdoms/x 中不起作用。当然,问题是没有数据表信息被发送到视图($dataTable 未定义)。我应该在控制器中构建并发送它,还是以某种方式通过 ajax 加载它?html builder的东西,也许吧?完成此任务的最简单方法是什么,请记住我需要包含多个数据表?我在这里走错了路,还是我可以将 dataTable 信息发送到视图?

4

1 回答 1

0

解决方案是使用相关数据表中的 html 构建器函数。

控制器

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

XView

@include('y.table')

大多数数据表的东西都是用 html() 函数设置的,数据源是由 ajax() 函数定义的。你可以从那里过滤等等。

于 2018-07-25T01:05:12.067 回答