"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo agregar propiedades personalizadas cuando el modelo elocuente de Laravel se está cargando?

¿Cómo agregar propiedades personalizadas cuando el modelo elocuente de Laravel se está cargando?

Publicado el 2025-04-15
Navegar:963

How to Add Custom Attributes to Laravel Eloquent Models on Load?

cómo agregar atributos personalizados a los modelos elocuentes de Laravel en la carga?

en Laravel elocuente, puede encontrar un escenario en el que desee agregar un atributo personalizado a un modelo cuando se carga. Por ejemplo, considere un controlador como este:

public function index()
{
    $sessions = EventSession::all();
    foreach ($sessions as $i => $session) {
        $sessions[$i]->available = $session->getAvailability();
    }
    return $sessions;
}

sería conveniente omitir el bucle manual y tener el atributo 'disponible' poblado automáticamente.

el problema

el problema aquí es que el método toArray () de un modelo ignora los accesorios que no corresponden a columnas en la mesa subyacente. Este es un diseño intencional por razones de rendimiento.

the Solution

Laravel Versions> = 8:

afortunadamente, hay una forma elegante para lograr esto usando la clase de atributos:

[&] [&] [&] [&] [y] protegido $ table = 'sesiones'; Disponibilidad de función pública () { devolver nuevo atributo ( Get: fn () => $ this-> calculateAvailability () ); } }
class EventSession extends Eloquent {

    protected $table = 'sessions';

    public function availability()
    {
        return new Attribute(
            get: fn () => $this->calculateAvailability()
        );  
    }
}
laravel versions opción 1: apagar propiedad

para versiones menos que 8, puede usar la propiedad $ appends para controlar qué atributos se incluyen en el formulario serializado del modelo:

[&] [&] y & y &] Classion para control Elocuente { protegido $ table = 'sesiones'; protegido $ appends = array ('disponibilidad'); función pública getAVailabilityAttribute () { devolver $ this-> calculateAvailability (); } }

class EventSession extends Eloquent {

    protected $table = 'sessions';
    protected $appends = array('availability');

    public function getAvailabilityAttribute()
    {
        return $this->calculateAvailability();  
    }
}

alternativamente, puede anular el método toArray () y establecer manualmente el atributo: del libro de clases extiende elocuente { protegido $ table = 'libros'; Función pública ToArray () { $ array = parent :: toArray (); $ array ['superior'] = $ this-> superior; devolver $ array; } función pública getupperattribute () { return strtoupper ($ this-> title); } }

opción 3: bucle a través de atributos mutados
class EventSession extends Eloquent {

    protected $table = 'sessions';

    public function availability()
    {
        return new Attribute(
            get: fn () => $this->calculateAvailability()
        );  
    }
}
Si tiene numerosos accesorios personalizados, puede iterar a través de ellos y aplicarlos durante la serialización:

Libro de clases extiende elocuente { protegido $ table = 'libros'; Función pública ToArray () { $ array = parent :: toArray (); foreach ($ this-> getMutatedAttributes () como $ clave) { if (! array_key_exists ($ key, $ array)) { $ array [$ key] = $ this-> {$ key}; } } devolver $ array; } función pública getupperattribute () { return strtoupper ($ this-> title); } }

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3