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); } }
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