Laravel - extraer elemento de collection

Quitar objeto de una collection con el método pull

En un proyecto he necesitado poder sacar objeto de una collection antes de mandarla a la vista en caso de que este haya caducado, es decir, si han pasado más de 30 días desde la fecha introducida en el campo created_at de la tabla correspondiente.

Para esto he utilizado el método pull() sobre la collection.

Laravel - sacar objeto de una collection

 


$date = new Carbon;
$collection = $user->datos()->get();
foreach ( $collection as $id_obj => $obj )
{
$fecha_caduca = $date->createFromFormat( 'Y-m-d H:i:s', $obj->created_at )->addDays(30);
$caduca = $fecha_caduca->toDateTimeString();
if ( $date->now() >= $caduca )
{
$obj->delete();
$collection->pull( $id_obj );
}
}

 

Utilizo Carbon para trabajar con las fechas ( use Carbon\Carbon ). A continuación extraigo la collection sobre la que voy a trabajar ( $collection ) y al recorrerla con un foreach me aseguro de sacar la posición que los objetos ocupan en la misma ( $id_obj ).

En la siguiente línea preparo la fecha en que caducan los objetos ( $caduca ) y la convierto con $fecha_caduca->toDateTimeString() para compararla con la actual ( $date->now() ) y saber si el objeto la ha sobrepasado.

Si el objeto ha caducado procedo a borrarlo ( $obj->delete() [en el proyecto utilizo softDelete] ) pero después la pasaré a la vista $collection  para mostrar una lista de elementos.

En esa lista no quiero que se muestren los objetos caducados así que tengo que sacarlos de $collection.

Para hacer esto utilizo el método pull() al cual tengo que pasarle la posición del objeto concreto dentro de la collection, por esto me he asegurado antes de sacar la $id_obj.

En las siguientes ocasiones que consulte esa collection los objetos caducados ya no aparecerán a menos que la consulta se haga añadiendo el método withTrashed().

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.