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