Quitar objeto de una collection con el método pull

Laravel - extraer elemento de collection

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().

¡Compartir mola!Share on Facebook0Share on Google+0Share on LinkedIn0Tweet about this on TwitterBuffer this pageEmail this to someone

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *