Сортировка таблицы - простой вариант Part 1

Отредачено 05.05.2025,
а чекнуто 527 💁

У меня была таблица

<table class="table table-hover">
    <thead>
    <tr class="fw-bold fs-6 text-gray-800">
        <th>ID</th>
        <th>Задача</th>
        <th>Ответственный</th>
        <th>Место</th>
        <th>Статус</th>

    </tr>
    </thead>
    @forelse($tasks as $t)
        <tr>
            <td><a href="{{ route('tasks.edit', $t->id) }}">{{ $t->id }}</a></td>
            <td>{{ $t->task }}</td>
            <td>{{ $t->employer->last_name }} {{ $t->employer->first_name }}</td>
            <td>{{ $t->organization->name }}/{{ $t->building->name }}/{{ $t->room->name }}</td>
            <td><span class="badge badge-light-dark">{{ $t->status?->name }}</span></td>
        </tr>
    @empty
        <tr>
            <td><h3>Список пуст</h3></td>
        </tr>
    @endforelse
</table>

По сути - обычная таблица, но для нее нужна сортировка и фильтры, я занялся сортировкой.

И выбрал простой вариант, есть и посложнее.

Для этого устанавливаем пакет:

composer require kyslik/column-sortable

 

В таблице вносим изменение в thead, сразу скажу что storm так и не определил @sortablelink()

@sortablelink('id', 'ID')@sortablelink('task', 'Задача')@sortablelink('employer.last_name', 'Ответственный')Место@sortablelink('status.name', 'Статус')

 

В модельке

class Task extends Model
{
    use Sortable;
    
    public $sortable = [
        'id',
        'task'
    ];
    
    // Добавляем сортируемые отношения (думаю, логика понятна почему и как)
    public $sortableAs = [
        'employer_last_name' => 'employer.last_name',
        'status_name' => 'status.name',
    ];
    
    // Обязательно нужны отношения
    public function employer()
    {
        return $this->belongsTo(Employer::class);
    }
    
    public function status()
    {
        return $this->belongsTo(Status::class);
    }
}

 

И остается только добавить изменение в контроллер 

public function list(): View
    {
        return view(
            'dashboard.admin.' . $this->localName . '.list',
            [
                'title'          => 'Список ' . $this->listName,
                $this->localName => $this->model->with(['employer', 'status','organization','room','building'])->sortable()->paginate(15)
            ]
        );
    }

Ключевое здесь это - ->sortable(), загрузка отношений, можно через load и ->orderBy() должна быть до -> sortable(), иначе гг

На этом всё

Laravel Оптимизация Из реального мира