€0.00 — free as in speechtonight's forecast: clear skies over production Cache: warm · Deploys: fair, 0% rollbacks expectedset by moonlight, shipped before dawn · deploy freely Page A2

❦The Daily Commit❦ ☾The Nightly Build☽

Dev news, typeset daily — PHP · AI · The Wider Stack

The developer's evening paper — PHP · AI · The Wider Stack

lunes, 9 de noviembre de 2026 Vol. I — No. 895 · Edición matinalEdición vespertina EN DE FR ES

PHP · Lanzamientos

Laravel 13.38 refuerza la coherencia de los datos

Laravel 13.38.0 dirige las lecturas a la conexión de escritura durante dos segundos después de una modificación y añade DB::usingWritePdo() para consultas de relaciones que necesitan datos recientes.

seleccionado por Heiko

Rule::unique() admite ahora valores float en sus condiciones. La iteración diferida libera bloques anteriores y llegan correcciones para trabajos programados, Eloquent, SQLite, rutas y colas.

La mejora más práctica para las conexiones de base de datos es DB::usingWritePdo(). El método ejecuta una cadena de consultas mediante la conexión de escritura dentro de un callback y recupera la configuración anterior al terminar, incluso si se produce una excepción.

usingWritePdo.php
<?php
use Illuminate\Support\Facades\DB;

$posts = DB::usingWritePdo(
    fn () => User::query()
        ->where('email', $email)
        ->first()
        ?->posts()
        ->whereNull('published_at')
        ->get()
);

Esto resuelve un caso en el que el modelo inicial se obtiene desde la conexión de escritura, pero una consulta posterior sobre una relación termina en una réplica de lectura. El patrón resulta útil para consultar un pedido con su estado más reciente, leer el inventario después de ajustarlo o cargar permisos tras cambiar un rol.

El middleware PreventStaleDatabaseReads coordina las lecturas posteriores a una escritura entre distintas peticiones. Después de escribir en la conexión predeterminada, Laravel guarda una marca de tiempo en la sesión. Durante los dos segundos siguientes, las lecturas de ese usuario utilizan la conexión de escritura. Un grupo de rutas puede ampliar el periodo a diez segundos mediante PreventStaleDatabaseReads::for(10). La función requiere una sesión y solo ayuda al usuario que realizó la escritura. Por eso no sirve como solución general para API sin estado. Una aplicación con una sola conexión tampoco necesita este middleware.

La validación permite ahora valores float en la condición where de Rule::unique(). Una regla puede incluir, por ejemplo, 19.99 cuando la unicidad depende de la combinación entre un SKU y un precio. El cambio no sustituye una restricción de base de datos. La unicidad permanente de varias columnas debe seguir respaldada por un índice adecuado.

Eloquent corrige el uso de alias de ofMany() dentro de closures y las consultas agregadas de relaciones one-of-many autorreferenciadas. Estas relaciones seleccionan un único registro según un criterio, como el precio efectivo más reciente o el estado actual. Los proyectos que dependen de estas definiciones deberían incorporar pruebas de regresión antes de actualizar.

Los iteradores lazy() y lazyById() liberan ahora el bloque anterior conforme avanza el procesamiento. Esto reduce la memoria retenida durante exportaciones grandes, cambios masivos de inventario, procesos históricos, trabajos en segundo plano y migraciones. El consumo no será constante si el callback conserva todos los modelos procesados.

Los Unique Jobs eliminan ahora su bloqueo de caché si falla el despacho de un trabajo programado. Así, los siguientes intentos no quedan bloqueados por un lock abandonado. El cambio es relevante para informes periódicos, sincronizaciones con servicios externos e importaciones. Conviene probar los caminos de error con la configuración real de colas y caché.

La versión incorpora más correcciones para los valores float devueltos por collection mode(), las reglas de comparación de fechas que reciben valores no válidos y los cambios de esquema de SQLite con claves foráneas o nombres de tabla entre comillas. También mejora el tratamiento de Unique Broadcast Jobs omitidos. Los fallos inesperados de workers pueden contarse como excepciones para queued listeners, mailables y notifications que tengan esa opción activa. El almacenamiento en caché de rutas mejora cuando las rutas de salud se generan en una máquina y se usan en otra. Hay ajustes adicionales en la clonación de relaciones y en el comportamiento de las consultas de base de datos.

Para actualizar, php artisan --version muestra la versión instalada y composer show laravel/framework permite revisar la restricción del framework. composer update laravel/framework actualiza el paquete. Las dependencias relacionadas deben comprobarse antes de cambiar el conjunto instalado, y después hay que ejecutar php artisan test. Las pruebas deberían cubrir las lecturas inmediatas tras una escritura, las relaciones después de una modificación, las API sin sesión, los fallos de jobs programados, los procesos grandes con lazy() o lazyById() y las consultas ofMany(). Tras pasar por staging y producción, conviene vigilar las consultas, los errores de cola y los registros de la aplicación. Las notas oficiales de versiones de Laravel, el resumen de Laravel News y la documentación de Laravel 13.x son las referencias señaladas.

Leer la fuente original (en inglés) ↗

Valora este artículo: 0

Tribuna de lectores

Aún no hay aportaciones — abre el debate.

← The Daily CommitThe Nightly Build — Page A1