Saltar al contenido

Duplicar registros en Eloquent no se limita a clonar el modelo en memoria; la mayoría de las veces, también deseas duplicar sus relaciones para generar nuevos registros asociados. Si bien existían librerías como laravel-duplicate, hoy en día puedes lograrlo nativamente gracias a las funcionalidades que ofrece Laravel.

1. El método replicate()

Eloquent incluye el método replicate(), que clona un modelo creando una nueva instancia con los mismos atributos (excepto la clave primaria, campos de timestamps y atributos excluidos manualmente).

Atención: replicate() no clona automáticamente las relaciones. Para ello, se requieren pasos adicionales.


2. Duplicar Relaciones Manualmente

2.1. HasMany / HasOne

Supongamos que un Invoice tiene muchos Item (relación hasMany). Para duplicar la relación, podríamos hacer:

Claves:

  • Cargar la relación con with().

  • Replicar cada item y reasignar la FK.

2.2. BelongsToMany

Para relaciones muchos a muchos, donde existe una tabla pivote, el proceso difiere: normalmento no replicarás los modelos de la relación, sino que clonarás los registros de la tabla pivote o sincronizarás los IDs existentes.


3. Encapsular la Lógica en una Clase de Acción (Action)

Para proyectos medianos o grandes, es común organizar la lógica de negocio en Actions o Services. Aquí tienes un ejemplo de una Action para duplicar un Invoice con sus Items.

3.1. Clase DuplicateInvoiceAction

Explicación:

  1. Transacción: Usamos DB::transaction para asegurar que, si algo falla, no se queden datos duplicados a medias.

  2. Replicamos: Llamamos a $invoice->replicate() y guardamos.

  3. Duplicamos la relación: Para cada item del invoice original, creamos uno nuevo y asignamos la FK al id del nuevo invoice.

3.2. Uso en Controladores o Servicios

Al querer duplicar un Invoice:

Aquí, simplemente cargamos las relaciones necesarias (with('items')), instanciamos la Action y llamamos a execute($invoice).


4. Excluir atributos concretos de replicate()

Puede que haya atributos que no desees duplicar (tokens, hashes, etc.). Laravel te permite excluirlos explícitamente:

De este modo, 'token' no será copiado en el nuevo modelo.


5. Consideraciones Finales

  1. Múltiples relaciones: Si tu modelo principal tiene varias relaciones (items, payments, attachments, etc.), repite el mismo patrón para cada una.

  2. Encapsular: La clase DuplicateInvoiceAction es un ejemplo de cómo centralizar la lógica de duplicación. Así, tu código se mantiene limpio y testeable.

  3. Transacciones: En acciones complejas, envolver todo en una transacción (DB::transaction) puede evitar inconsistencias en la base de datos.


Conclusión

Para duplicar modelos y sus relaciones de forma nativa en Laravel:

  • Usa replicate() para clonar el modelo principal.

  • Carga y duplica manualmente cada relación, reasignando las claves foráneas o sincronizando tablas pivote.

  • Encapsula la lógica en un método o Action (como DuplicateInvoiceAction) para un mejor mantenimiento.

  • Transacciones para un proceso seguro y sin datos a medias.

¿Ya has implementado la duplicación de modelos y relaciones en tus proyectos Laravel? ¡Comparte esta entrada con tus colegas y no olvides explorar la Ruta de Aprendizaje Laravel 11!

school Curso completo

Curso Laravel 12
Completo 2026

El único curso 100% actualizado que incluye Laravel 12, Livewire 3, Vue 3, React 19 e Inertia 2. Aprende con proyectos reales y las últimas funcionalidades.

access_time 8 horas de contenido
layers 4 tecnologías en 1
update 100% actualizado
code Proyectos prácticos
Ver Curso Laravel 12 arrow_forward

star Incluido en cualquier suscripción

Rutas de aprendizaje