Creación de modelos consistentes con withAttributes en Laravel

  • Publicado el 28 febrero, 2025
  • Palabras: 113

¿Necesitas asegurarse de que los atributos estén configurados al crear modelos a través de relaciones? El método withAttributes de Laravel ofrece una solución elegante para la creación de modelos consistentes a través de métodos de relación.

Creación de modelos consistentes con withAttributes en Laravel

Cuando se trabaja con métodos de relación restringidos, a menudo se desea que los modelos recién creados mantengan las mismas restricciones. El método withAttributes de Laravel garantiza que los modelos creados a través de estos métodos de relación reciban automáticamente los atributos esperados. Veamos cómo funciona:

 

class User extends Model
{
    // Base relationship
    public function posts(): HasMany
    {
        return $this->hasMany(Post::class);
    }

    // Constrained relationship with withAttributes
    public function featuredPosts(): HasMany
    {
        return $this->posts()
            ->where('featured', true)
            ->withAttributes(['featured' => true]);
    }
}

 

#Ejemplo práctico

A continuación se muestra cómo puede utilizar withAttributes en un sistema de gestión de contenido:

 

class Category extends Model
{
    // Base products relationship
    public function products(): HasMany
    {
        return $this->hasMany(Product::class);
    }

    // Published products with consistent creation
    public function publishedProducts(): HasMany
    {
        return $this->products()
            ->where('status', 'published')
            ->withAttributes(['status' => 'published']);
    }

    // Featured products with consistent creation
    public function featuredProducts(): HasMany
    {
        return $this->products()
            ->where('featured', true)
            ->withAttributes([
                'featured' => true,
                'featured_at' => now()
            ]);
    }
}

 

Ahora, cuando cree modelos a través de estas relaciones restringidas, incluirán automáticamente los atributos especificados:

 

// Create a published product
$product = $category->publishedProducts()->create([
    'name' => 'New Product',
    'price' => 99.99
]);

// The status will automatically be "published"
dd($product->status); // "published"

// Create a featured product
$featured = $category->featuredProducts()->create([
    'name' => 'Featured Item'
]);

// Automatically gets featured attributes
dd($featured->featured); // true
dd($featured->featured_at); // current timestamp

 

El método withAttributes resuelve el problema común de inconsistencia de atributos al crear modelos a través de relaciones restringidas. Garantiza que los modelos creados a través de relaciones filtradas mantengan las mismas restricciones que definen la relación.

Antonio Jenaro
Antonio Jenaro

Web Developer

Archivado en:

Fuente: Harris Raftopoulos

Artículos relacionados

Consejos sobre los modelos en Laravel
159

Consejos sobre los modelos en Laravel

String IDs personalizados en modelos de Laravel: un nuevo enfoque
538

String IDs personalizados en modelos de Laravel: un nuevo enfoque

Inicia la conversación

Hazte miembro de Antonio Jenaro para comenzar a comentar.

Regístrate ahora

¿Ya estás registrado? Inicia sesión