Taules i columnes
Les columnes defineixen què es mostra al llistat d'un Resource. Es declaren dins de columns():
public function columns(): array
{
return [
Column::make('title')->sortable()->searchable(),
Column::make('is_published')->as('boolean')->sortable(),
Column::make('published_at')->as('date')->displayFormat('d/m/Y')->sortable(),
Column::make('status')
->as('badge')
->value(fn (Post $post): string => $post->is_published ? 'Published' : 'Draft')
->color(fn (Post $post): string => $post->is_published ? 'success' : 'gray'),
];
}API de Column
| Mètode | Descripció |
|---|---|
make(string $name) | El nom de l'atribut a l'Eloquent model (o el nom lògic, si fas servir value()). |
label(string $label) | Etiqueta de la capçalera. Per defecte, Str::headline($name). |
as(string $type) | Com es renderitza la cel·la al frontend: text (per defecte), boolean, date, badge… |
sortable(bool $sortable = true) | Permet ordenar el llistat per aquesta columna. |
hiddenByDefault(bool $hidden = true) | Amagada per defecte; l'usuari la pot mostrar des del selector de columnes i triar l'ordre des del mateix llistat. |
displayFormat(string $format) | Format de visualització quan as('date') (sintaxi date() de PHP). |
value(Closure $callback) | Substitueix el valor de la cel·la per un valor calculat. Rep el model complet, no només l'atribut. |
color(Closure $callback) | Color de la cel·la (rellevant sobretot per a as('badge')). Rep el model complet. |
circular(bool $circular = true) | Renderitza el valor d'una columna as('image') com un avatar circular. No fa res a la resta de tipus. |
url(Closure $callback) | Resol un enllaç per fila. Rep el model i retorna la URL, o null per deixar aquella fila sense enllaç. |
searchable(bool $searchable = true, ?Closure $using = null, ?Closure $refine = null) | Inclou la columna a la cerca de text lliure del llistat. Amb using, substitueix el LIKE per defecte, i amb refine, afina el resultat en PHP (vegeu «Cerca a mida»). |
Una columna as('boolean') es renderitza com una icona (✓/✗), no com el text «Yes»/«No» codificat en anglès.
Columnes amb imatge i enllaç
Column::make('cover_path')
->as('image')
->circular()
->url(fn (Post $post): ?string => $post->cover_path === null ? null : "/storage/{$post->cover_path}")
->hiddenByDefault()El callback de url() rep el registre Eloquent i retorna l'enllaç. El resultat s'afegeix a cada fila com {columna}_url, de la mateixa manera que el color resolt d'una columna badge s'afegeix com {columna}_color, no es serveix com a propietat de l'schema, es calcula per fila.
Cerca a mida
Per defecte, searchable() compara el terme de cerca de l'índex contra la columna amb un LIKE senzill. Passa-hi using per a columnes que no es poden comparar així, una columna virtual, o una xifrada:
Column::make('author')
->value(fn (Post $post): ?string => $post->author?->name)
->searchable(using: fn (Builder $query, string $term): Builder => $query->whereHas(
'author',
fn (Builder $author) => $author->where('name', 'like', "%{$term}%")
))El closure rep un query builder niat nou i el terme de cerca en cru; ha de mutar el builder que rep en lloc de retornar-ne un altre de diferent, perquè el where(Closure) de Laravel descarta el que li retornis.
Cerques que SQL només pot estrènyer
Una columna xifrada, per exemple, no es pot comparar amb LIKE, però sí que es pot indexar per un prefix. Amb refine, using només estreny els candidats i refine decideix en PHP quins coincideixen:
Column::make('name')->searchable(
using: fn (Builder $query, string $term): Builder => $query->where('name_index', 'like', mb_substr($term, 0, 3).'%'),
refine: fn (Student $student, string $term): bool => str_contains(mb_strtolower($student->name), mb_strtolower($term)),
)using s'executa a SQL i dóna com a màxim 500 candidats. refine rep cada candidat i el terme, i retorna si coincideix. Els candidats que passen es combinen amb la resta de columnes cercables del llistat.
Columnes calculades
value() i color() reben el registre Eloquent sencer, no un simple $record->$name: una columna «lògica» que no correspon a cap atribut és tan vàlida com una de directa. L'exemple de status de dalt no llegeix cap columna status de la base de dades, la calcula a partir de is_published.
Column::make('status')
->as('badge')
->value(fn (Post $post): string => $post->is_published ? 'Published' : 'Draft')
->color(fn (Post $post): string => $post->is_published ? 'success' : 'gray')Vista de només lectura
Quan un Resource té una ViewAction, Arrel reutilitza columns() per renderitzar la vista de detall del registre, amb el mateix as(), value() i color() de cada columna. Per agrupar-les en seccions amb títol, declara infolist(). Una entrada buida es mostra com un guió.