Функция поиска в отредактированной строке Laravel DataTables не работает - PullRequest
0 голосов
/ 22 января 2019

Я должен отобразить список перевозок следующим образом:

table

Сущность "транспорт" может иметь много транспортных объектов. Я использую фреймворк 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 */

}

?> 

Так что мне делать и как заставить работать эту функцию поиска? Я знаю, что на первый взгляд это выглядит глупо: в перевозке может быть много предметов, поэтому данные о перевозках не должны отображаться в списке перевозок. С другой стороны, я знаю, что в реальном мире для каждой перевозки может быть только несколько предметов.

Какие могут быть разные решения для решения этой проблемы? Составить список предметов перевозки? Тогда надо договориться с моим менеджером.

...