Saltar al contenido

¿Cómo eliminar registros relacionados cuando se elimina un registro principal en Laravel?

Nuestros mejores desarrolladores han agotado sus depósitos de café, buscando día y noche por la respuesta, hasta que Benjamín halló el arreglo en Beanstalk así que en este momento la comparte con nosotros.

Solución:

Elocuente no proporciona la eliminación automática de objetos relacionados, por lo tanto, deberá escribir algo de código usted mismo. Afortunadamente, es bastante simple.

modelos elocuentes disparar diferentes eventos en diferentes etapas del ciclo de vida del modelo, como crear, crear, eliminar, eliminar, etc. Puede leer más sobre esto aquí: http://laravel.com/docs/5.1/eloquent#events. Lo que necesita es un oyente que se ejecutará cuando eliminado se activa el evento: este detector debe eliminar todos los objetos relacionados.

Puede registrar oyentes modelo en su modelo bota() método. El oyente debe recorrer todos los pagos de la factura que se está eliminando y debe eliminarlos uno por uno. La eliminación masiva no funcionará aquí, ya que ejecutaría la consulta SQL directamente sin pasar por los eventos del modelo.

Esto hará el truco:

class MyModel extends Model 
  protected static function boot() 
    parent::boot();

    static::deleted(function ($invoice) 
      $invoice->payments()->delete();
    );
  

Puedes ir de 2 maneras con esto.

La forma más sencilla sería anular Eloquents delete() método e incluir los modelos relacionados también, por ejemplo:

public function delete()

    $this->payments()->delete();
    return parent::delete();
 

El método anterior debería funcionar, pero parece un poco sucio y diría que no es el método preferido dentro de la comunidad.

La forma más limpia (IMO) sería aprovechar los eventos de Eloquents, por ejemplo:

public static function boot()

    parent::boot();

    static::deleting(function($invoice)  
         $invoice->payments()->delete();

    );

Cualquiera (pero no ambos) de los métodos anteriores entraría en su Invoice modelo. Además, asumo que tiene sus relaciones configuradas en su modelo, sin embargo, no estoy seguro si permite pagos múltiples para una factura. De cualquier manera, es posible que deba cambiar el payments() en los ejemplos a lo que sea que haya llamado la relación en su modelo de factura.

¡Espero que esto ayude!

Sé que hiciste esta pregunta hace mucho tiempo, pero encontré que este paquete es muy simple y directo.

O puede usar este paquete, también es útil.

Recuerda para instalar la versión correcta dependiendo de su versión de laravel.

Debes instalarlo a través de composer:

 composer require askedio/laravel5-soft-cascade ^version

En segundo paquete:

 composer require iatstuti/laravel-cascade-soft-deletes

Registre el proveedor de servicios en su config/app.php.

puede leer los documentos en la página de GitHub.

Si elimina un registro, este paquete reconoce todos sus elementos secundarios y también los elimina temporalmente.

Si tiene otra relación en su modelo hijo, use su rasgo en ese modelo también. es mucho más fácil que hacerlo manualmente.

El segundo paquete tiene la ventaja de eliminar a los nietos del modelo. en algunos casos, digo que es un mejor enfoque.

Calificaciones y comentarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *