Optimiza las inserciones masivas con el nuevo método fillAndInsert() de Laravel

  • Publicado el 29 abril, 2025
  • Palabras: 146

¿Insertas modelos Eloquent masivamente pero necesitas aplicar conversiones y marcas de tiempo? El nuevo método fillAndInsert() de Laravel ofrece una solución elegante al gestionar la conversión de modelos y la preparación de atributos durante la inserción masiva.

Optimiza las inserciones masivas con el nuevo método fillAndInsert() de Laravel

Al realizar inserciones masivas en Laravel, a menudo se enfrenta a un dilema: usar insert() para mayor eficiencia, pero perder la conversión de datos y la preparación de atributos de Eloquent, o crear y guardar modelos individuales para obtener la funcionalidad completa, pero sacrificar el rendimiento. El nuevo método fillAndInsert() soluciona este problema aplicando conversión de datos a nivel de modelo, marcas de tiempo y generación de UUID, manteniendo al mismo tiempo la eficiencia de las inserciones masivas.

Veamos cómo funciona:

 

User::fillAndInsert([
    [
        'name' => 'Taylor',
        'email' => 'taylor@example.com',
        'role' => UserRole::Admin,
    ],
    [
        'name' => 'Nuno',
        'email' => 'nuno@example.com',
        'role' => 3, // Will be cast to enum
    ],
]);

 

#Ejemplo práctico

Este método es particularmente valioso cuando se insertan registros en masa que necesitan aprovechar las capacidades de conversión de Eloquent, como conversiones de enumeración, conversiones de fecha o generación de UUID:

 

class Product extends Model
{
    protected $fillable = [
        'name', 'price', 'status', 'category_id', 'attributes'
    ];
    
    protected function casts(): array
    {
        return [
            'price' => 'decimal:2',
            'status' => ProductStatus::class,
            'attributes' => 'array',
            'id' => 'string',
        ];
    }
    
    public static function boot()
    {
        parent::boot();
        
        static::creating(function ($model) {
            if (empty($model->id)) {
                $model->id = Str::uuid();
            }
        });
    }
}

// Bulk insert with proper casting and UUID generation
Product::fillAndInsert([
    [
        'name' => 'Laptop Pro',
        'price' => '1299.99',
        'status' => ProductStatus::Available,
        'attributes' => ['color' => 'silver', 'ram' => '16GB'],
    ],
    [
        'name' => 'Wireless Earbuds',
        'price' => '199.50',
        'status' => 'available', // String will be cast to enum
        'attributes' => json_encode(['color' => 'black', 'battery' => '24h']), // String will be cast to array
    ],
    [
        'name' => 'Smart Watch',
        'price' => 299,
        'status' => 1, // Integer will be cast to enum
        'attributes' => ['color' => 'blue', 'size' => 'medium'],
    ],
]);

 

Al aprovechar el nuevo método fillAndInsert(), puede escribir un código de inserción masiva más limpio y consistente y, al mismo tiempo, beneficiarse de las potentes capacidades de preparación de atributos y conversión de Eloquent.

Antonio Jenaro

Desarrollador backend especializado en PHP y Laravel, con sede en Santander, Cantabria. Más de 15 años de experiencia en el desarrollo de aplicaciones web a medida y en la modernización de código heredado.

Archivado en:

Fuente: Harris Raftopoulos

Inicia la conversación

Hazte miembro de Antonio Jenaro para comenzar a comentar.

Regístrate ahora

¿Ya estás registrado? Inicia sesión