$reportes = DB::table('personals') ->select( 'personals.id as personal_id', 'personals.nombre', 'personals.paterno', 'personals.materno', 'personals.dni', 'instituciones.nombre as institucion_nombre', 'cargos.nombre as cargo_nombre', DB::raw("CONCAT(detalles.tar_hor, ' horas ', detalles.tar_min, ' minutos') as tiempo_tardanza") ) ->join('cargos', 'personals.cargo_id', '=', 'cargos.id') ->join('instituciones', 'personals.institucion_id', '=', 'instituciones.id') ->leftJoin('detalles', 'personals.id', '=', 'detalles.perosnal_id') ->leftJoin(DB::raw("(SELECT DISTINCT perosnal_id AS id, 1 AS exist FROM asistencias WHERE estado = 'T' AND calendario_id = $calendario_id) AS a_t"), function($join) { $join->on('personals.id', '=', 'a_t.id'); }) ->where('a_t.exist', 1) ->get(); SELECT personals.id AS personal_id, personals.nombre, personals.paterno, personals.materno, personals.dni, instituciones.nombre AS institucion_nombre, cargos.nombre AS cargo_nombre, CONCAT(detalles.tar_hor, ' horas ', detalles.tar_min, ' minutos') AS tiempo_tardanza FROM personals JOIN cargos ON personals.cargo_id = cargos.id JOIN instituciones ON personals.institucion_id = instituciones.id LEFT JOIN detalles ON personals.id = detalles.perosnal_id LEFT JOIN asistencias ON personals.id = asistencias.perosnal_id AND asistencias.estado = 'T' AND asistencias.calendario_id = 4 -- Cambia esto por el valor correcto de calendario_id WHERE asistencias.perosnal_id IS NOT NULL AND detalles.calendario_id = 4 -- Cambia esto por el valor correcto de calendario_id al migrar a otro equipo o servidor composer install - para crear un enviador de correo: php artisan make:mail Notificacion - para crear un traea programada: php artisan make:command NotificarDocumentosVencidos /usr/local/bin/php /home/gofl6733/public_html/artisan schedule:run >> /dev/null