Me gustaría poder agregar un atributo / propiedad personalizado a un modelo Laravel / Eloquent cuando se carga, de forma similar a cómo se podría lograr con el $model->open()
método de RedBean .
Por ejemplo, en este momento, en mi controlador tengo:
public function index()
{
$sessions = EventSession::all();
foreach ($sessions as $i => $session) {
$sessions[$i]->available = $session->getAvailability();
}
return $sessions;
}
Sería bueno poder omitir el ciclo y tener el atributo 'disponible' ya establecido y poblado.
Intenté usar algunos de los eventos del modelo descritos en la documentación para adjuntar esta propiedad cuando se carga el objeto, pero hasta ahora no he tenido éxito.
Notas:
- 'disponible' no es un campo en la tabla subyacente.
$sessions
se devuelve como un objeto JSON como parte de una API y, por lo tanto, llamar a algo como$session->available()
en una plantilla no es una opción
protected $hidden = []
para agregar columnas / accesores que hayan excluido.Lo último en la página de documentos de Laravel Eloquent es:
Eso se puede usar automáticamente para agregar nuevos accesos al modelo sin ningún trabajo adicional, como modificar métodos como
::toArray()
.Basta con crear
getFooBarAttribute(...)
descriptor de acceso y añadir lafoo_bar
de$appends
matriz.fuente
toArray
método.Si cambia el nombre de su
getAvailability()
método agetAvailableAttribute()
su método, se convierte en un descriptor de acceso y podrá leerlo->available
directamente en su modelo.Documentos: https://laravel.com/docs/5.4/eloquent-mutators#accessors-and-mutators
EDITAR: Dado que su atributo es "virtual", no está incluido por defecto en la representación JSON de su objeto.
Pero encontré esto: ¿ Los accesos de modelos personalizados no se procesan cuando -> toJson () llama?
Para forzar que su atributo sea devuelto en la matriz, agréguelo como una clave a la matriz $ atributos.
No lo probé, pero debería ser bastante trivial para que lo intentes en tu configuración actual.
fuente
->available
disponible en el$session
objeto, pero a medida que$sessions
se convierte directamente en una cadena JSON (es parte de una API), no hay posibilidad de usar esto.EventSession::all()
devuelve un objeto JSON de una API, realmente no está utilizando un modelo de Laravel, ¿verdad? Lo siento, estoy confundido sobre cómo implementó su modelo.class EventSession extends Eloquent
).::all()
Es solo un ejemplo.EventSession::find(170071)
Sería otro. Se llaman en varios puntos a lo largo de SessionController (SessionController extends \BaseController
) que se llamarían a través de URL como '/ sessions / 170071'.public $available
al modelo, esto no se muestra cuando se convierte el objeto.protected $appends = array('is_admin');
)Tenía algo simular: tengo una imagen de atributo en mi modelo, que contiene la ubicación del archivo en la carpeta Almacenamiento. La imagen debe devolverse codificada en base64
fuente
puede usar la
setAttribute
función en Modelo para agregar un atributo personalizadofuente
Digamos que tiene 2 columnas llamadas first_name y last_name en su tabla de usuarios y desea recuperar el nombre completo. puedes lograrlo con el siguiente código:
ahora puedes obtener el nombre completo como:
fuente
Paso 1: Definir atributos en
$appends
Paso 2: Definir el descriptor de acceso para esos atributos.
Ejemplo:
fuente
En mi modelo de suscripción, necesito saber si la suscripción está pausada o no. así es como lo hice
luego en la plantilla de vista, puedo usar
$subscription->is_paused
para obtener el resultado.El
getIsPausedAttribute
es el formato para establecer un atributo personalizado,y usa
is_paused
para obtener o usar el atributo en su vista.fuente
en mi caso, crear una columna vacía y configurar su accesor funcionó bien. mi descriptor de acceso llenando la edad del usuario desde la columna dob. La función toArray () también funcionó.
fuente