Таблиці Filament спочатку будувалися навколо Eloquent, але з методом records() джерелом рядків може бути будь-що: масив, колекція, відповідь стороннього API.
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\Http;
public function table(Table $table): Table
{
return $table
->records(function (int $page, int $recordsPerPage, ?string $sortColumn, ?string $sortDirection, ?string $search): LengthAwarePaginator {
$response = Http::baseUrl('https://api.example.com')
->get('/invoices', [
'page' => $page,
'per_page' => $recordsPerPage,
'sort' => $sortColumn,
'direction' => $sortDirection,
'q' => $search,
])
->throw()
->json();
return new LengthAwarePaginator(
collect($response['data'])->keyBy('id'),
total: $response['total'],
perPage: $recordsPerPage,
currentPage: $page,
);
})
->columns([
TextColumn::make('number')->searchable(),
TextColumn::make('amount')->money('UAH')->sortable(),
]);
}
Головна відмінність - усе вручну. Вбудовані пошук, сортування, фільтри й пагінація Filament генерують SQL. З власними даними їх немає кому виконати, тому параметри ін'єктуються в records():
$page,$recordsPerPage- для пагінації (повернутиLengthAwarePaginator);$sortColumn,$sortDirection- для сортування;$search- для пошуку;$filters- масив станів фільтрів.
Ключі масиву - ідентифікатори записів. Їх треба робити стабільними й унікальними (keyBy('id')): за ними Livewire відрізняє рядки між оновленнями, а дії отримують потрібний запис.
У колбеках колонок і дій запис - масив, а не модель: fn (array $record) => ....
Що врахувати:
- кожне оновлення таблиці (пошук, сторінка, сортування, polling) - новий HTTP-запит до API. Варто кешувати відповіді на короткий час і обробляти помилки, щоб недоступний API не ламав сторінку;
- ліміти й тайм-аути стороннього сервісу:
Http::timeout(), повтори, обмеження частоти; - дії (створення, редагування, видалення) теж пишуться вручну - через
action(), що викликає API; - авторизація лежить на вас: політики моделей тут не працюють;
- для невеликих статичних наборів (налаштування, довідники з конфіга) підходить простий масив без пагінації.