Я должен отобразить список перевозок следующим образом:
Сущность "транспорт" может иметь много транспортных объектов. Я использую фреймворк Laravel и пакет yajra / laravel-datatables-oracle. Отображается список, но встроенная функция поиска AJAX в datatables не работает должным образом: она не выполняет поиск в отредактированных строках таблицы «sender_address» и «delivery_address», где я объединяю все адреса отправителей и все адреса получателей.
Вот код:
<?php
namespace Modules\Transportations\Http\Controllers;
use Modules\Transportations\Entities\Transportation;
use Yajra\DataTables\Facades\DataTables;
use Yajra\DataTables\Services\DataTable;
class DataTablesTransportationsController extends DataTable
{
public function query()
{
$query = Transportation::query()->with([
'transportationItems'
]);
// closure for transportationItems does not work at all:
$query = DataTables::of($query)->filter(function ($queryInner) {
if (request()->has('search') && isset(request()->input('search')['value']) && !empty(request()->input('search')['value'])) {
$search_term = request()->input('search')['value'];
$queryInner->where('sender_address', 'LIKE', "%".$search_term."%");
}
});
return $query;
}
// editing columns of data table:
public function ajax()
{
$dataTablesObj = DataTables::eloquent($this->query())
->editColumn('sender_address', function($transportation){
$dataToImplode = [];
foreach ($transportation->transportationItems as $item) {
$dataToImplode[] = $item->sender_address;
}
return implode('<br/>', $dataToImplode);
})
->editColumn('delivery_address', function($transportation){
$dataToImplode = [];
foreach ($transportation->transportationItems as $item) {
$dataToImplode[] = $item->recipient_address;
}
return implode('<br/>', $dataToImplode);
});
return $dataTablesObj->make(true);
}
public function html()
{
/* if I remove attributes "'searchable' => false",
DataTables throws error, for example: "unknown column
'transportations.sender_address'" */
return $this->builder()
->columns([
[ 'data' => 'id', 'name' => 'transportations.id', 'title' => '<input type="checkbox" class="check-all" />', 'width' => 30, 'orderable' => false ],
[ 'data' => 'order_number', 'name' => 'order_number', 'title' => 'Nr.' ],
[ 'data' => 'sender_address', 'name' => 'sender_address', 'title' => 'Sender address', 'orderable' => false, 'searchable' => false ],
[ 'data' => 'delivery_address', 'name' => 'delivery_address', 'title' => 'Recipient address', 'orderable' => false, 'searchable' => false ],
])
->minifiedAjax();
}
}
/* and here is my main Transportations CRUD controller,
where I injected DataTablesTransportationsController object into index
method. It generates the table of transportations:
*/
namespace Modules\Transportations\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Modules\Transportations\Entities\Transportation;
class TransportationsController extends Controller
{
public function index( DataTablesTransportationsController $dataTable )
{
return $dataTable->render('transportations::index');
}
/* other methods ("actions") are here */
}
?>
Так что мне делать и как заставить работать эту функцию поиска? Я знаю, что на первый взгляд это выглядит глупо: в перевозке может быть много предметов, поэтому данные о перевозках не должны отображаться в списке перевозок. С другой стороны, я знаю, что в реальном мире для каждой перевозки может быть только несколько предметов.
Какие могут быть разные решения для решения этой проблемы? Составить список предметов перевозки? Тогда надо договориться с моим менеджером.