Todos los artículos

Supervisión de Modelos Eloquent en Laravel 11.22

Julian Beaujardin
Julian Beaujardin Reference: Laravel News September 5th, 2024

El equipo de Laravel lanzó la versión 11.22 esta semana, con el método chaperone() de Eloquent para relaciones inversas, soporte para pasar Enums respaldados a métodos Queuable, la capacidad de pasar Enums respaldados a los métodos de ruta ->name() y ->domain(), y más.

Relaciones Eloquent con Chaperone

Samuel Levy contribuyó con la relación de modelo Eloquent inverse/chaperone que Taylor demostró en su presentación en Laracon US 2024 durante la parte de código abierto de la charla.

public function comments(): HasMany
{
    return $this->hasMany(Comment::class)->chaperone('post');
}

El método chaperone()/inverse() evita consultas N+1 inesperadas al vincular de nuevo al modelo padre después de que se haya ejecutado la consulta de relación. La relación anterior enlazará el modelo Post apropiado en la relación correcta en instancias de Comment (manteniendo los scopes intactos).

Consulta el Pull Request #51582 para más detalles.

Soporte para Backed Enum en el Trait Queueable

Seth Phat contribuyó con el soporte para BackedEnum en los métodos del trait Queuable:

  • onQueue()
  • onConnection()
  • allOnQueue()
  • allOnConnection()

Aquí tienes un ejemplo del pull request:

use App\Enums\QueueConnection;
use App\Enums\QueueName;

// Antes
public function register()
{
    $user = User::create([...]);

    SendWelcomeEmailJob::dispatch($user)
        ->withConnection(QueueConnection::REDIS->value)
        ->onQueue(QueueName::HIGH->value);
}

// Después
public function register()
{
    $user = User::create([...]);

    SendWelcomeEmailJob::dispatch($user)
        ->withConnection(QueueConnection::REDIS)
        ->onQueue(QueueName::HIGH);
}

Permitir que se pasen Enums a las Rutas

@NickSdot contribuyó con la capacidad de pasar BackedEnum a los métodos de ruta domain() y name():

// Antes
Route::domain(InterfaceDomain::Marketing->value)
    ->name(Routes::Home->value)
    ->get('/contact', ContactController::class);

// Después
Route::domain(InterfaceDomain::Marketing)
    ->name(Routes::Home)
    ->get('/contact', ContactController::class);

Notas de la versión

Puedes ver la lista completa de nuevas características y actualizaciones a continuación, así como la diferencia entre 11.21.0 y 11.22.0 en GitHub. Las siguientes notas de la versión provienen directamente del changelog.