Tengo una columna expired_at en la base de datos; que al crear cualquier fila, por defecto será 5 minutos después de la hora de creación, y quiero excluir las filas en las que ha pasado su expired_at (más pequeño que el tiempo actual).
Por ejemplo, tengo estas filas en la tabla de games :
id creator_id created_at updated_at expire_at 1 123456789 2017-04-26 01:13:22 2017-04-26 01:13:22 2017-04-26 01:18:22 2 234567890 2017-04-26 01:16:06 2017-04-26 01:16:06 2017-04-26 01:21:06 Y cuando busco todas las filas con la función Game::all() o Game::where('condition') en el momento 01:19:30 , la fila 1 no debe recuperarse, pero la fila 2 sí, porque aún no ha expirado. .
No quiero procesar el tiempo de caducidad en el código de destino, sino en el código del modelo (por ejemplo, anulando la función where en la clase del modelo)
Puede lograr esto por medio de un alcance (global).
Véase también este enlace.
protected static function boot() { parent::boot(); static::addGlobalScope('not_expired', function (Builder $builder) { $builder->where('expired_at', '>', Carbon::now()); }); }Los ámbitos globales se aplicarán a todas las consultas excepto cuando los deshabilite específicamente.
Deshabilitarlos se puede hacer por:
Game::withoutGlobalScope('not_expired')->all();