Subconsultas con Laravel 6

Una de las mejoras de Laravel 6 es la utilización de subconsultas utilizando la potencia de Eloquent.

Gracias a esta nueva «feature» de Laravel podremos añadir datos desde tablas distintas en pocos pasos.

A continuación dejo algunos ejemplos útiles:

Ejemplos

Imaginemos que tenemos una tabla de usuarios y de logs.

Queremos ver el último log de cada usuario:

use App\Usuario; 
use App\LogUsuario; 

return Usuario::addSelect(['log_ult_fecha' => LogUsuario::select('fecha') 
->whereColumn('usuario_id', 'log_usuario.id') 
->orderBy('fecha', 'desc') 
->limit(1)])->get();

Ahora queremos que ademas de la fecha del log, nos devuelva el texto guardado con la información:

use App\Usuario; 
use App\LogUsuario; 

$ultimoLogUsuarios = [
'log_ult_fecha' => LogUsuario::select('fecha') 
    ->whereColumn('usuario_id', 'log_usuario.id') 
    ->orderBy('fecha', 'desc') 
    ->limit(1),
'log_ult_info' => LogUsuario::select('info') 
    ->whereColumn('usuario_id', 'log_usuario.id') 
    ->orderBy('fecha', 'desc') 
    ->limit(1)
];
return Usuario::addSelect($ultimoLogUsuarios)->get();

En este último ejemplo observamos que podemos añadir cuantas columnas requiramos agrupándolas en el array que espera el método estático addSelect. Podemos utilizar todos los modelos que necesitemos relacionando las claves necesarias y las condiciones que deseemos.

Esto nos puede dar una idea de las posibilidades que nos ofrece esta nueva característica.

Por ejemplo podríamos crear un método relacional dentro del modelo de UsuarioCon este mismo ejemplo pude pasar de usar unas Vistas de SQL SERVER  a utilizar el potencial de Eloquent y realizar la misma acción.

En algún caso pensé en realizar las consultas a estas vistas, pero ya que en su momento decidí exportar todo un sistema antiguo a utilizar el backend de Laravel 6, decidí hacerlo desde cero y experimentar con las nuevas herramientas que ofrece el nuevo Laravel. Es la mejor decisión que he tomado y deberías tomar si es tu caso.

namespace App;

use Illuminate\Database\Eloquent\Model;

class Usuario extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'usuarios';

    /**
    * Recupera el Ultimo Log del Usuario
    */
    public function UsuarioUltimoLog($estado = 3)
    {

        $ultimoLogUsuarios = [
            'log_ult_fecha' => LogUsuario::select('fecha') 
                ->whereColumn('usuario_id', 'log_usuario.id') 
                ->orderBy('fecha', 'desc') 
                ->limit(1),
            'log_ult_info' => LogUsuario::select('info') 
                ->whereColumn('usuario_id', 'log_usuario.id') 
                ->orderBy('fecha', 'desc') 
                ->limit(1)
        ];

        return Usuario::addSelect($ultimoLogUsuarios)
            ->where('estado', $estado)
            ->orderBy('id','DESC')
            ->paginate(15);
    }
}