Skip to content

Taules i columnes ​

Les columnes defineixen què es mostra al llistat d'un Resource. Es declaren dins de columns():

php
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ètodeDescripció
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ç ​

php
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:

php
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:

php
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.

php
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ó.