Laravel 5.2 с таблицами данных Yajra в представлении Read объекта, как я могу отобразить все таблицы данных для потомков hasMany родительской модели?

Родительская модель — Fiefdom, а дочерняя модель hasMany — Fief (но может и будет включать больше, позже). При переходе к / fiefdoms / x я хотел бы, чтобы после полей, относящихся к полям, отображался набор данных для дочерних моделей, по одному для каждого отношения hasMany.

У меня есть таблицы данных, которые прекрасно работают в изоляции (индекс феодального кода), но я немного запутался в том, как загрузить их на страницы, которые не посвящены одному источнику данных. Некоторые соответствующие фрагменты кода, которые я использую …

FiefController.php (index)

/**
* 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-конструктор? Какой самый простой способ выполнить эту задачу, помня, что мне нужно включить несколько таблиц данных? Я иду не туда, или я могу просто отправить данные dataTable в представление?

0

Решение

Решение состоит в том, чтобы использовать функцию построителя html, найденную в соответствующей таблице данных.

XController

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 (). Вы можете отфильтровать и еще много чего оттуда.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]