Saltar al contenido

Laravel Eloquent ORM: muchos a muchos eliminan los valores de la tabla dinámica sobrantes

Basta ya de indagar por todo internet ya que estás al espacio perfecto, poseemos la solución que quieres recibir pero sin problemas.

Solución:

El método de separación se utiliza para liberar una relación de la tabla dinámica, mientras que la eliminación eliminará el registro del modelo en sí, es decir, el registro en la tabla de revisiones. Tengo entendido que eliminar no activará la separación implícitamente. Sin embargo, puede usar eventos de modelo para desencadenar una limpieza de la tabla dinámica, usando algo como:

Review::deleting(function($review)

    $review->product()->detach()

Además, sugeriría que la relación sería de uno a muchos, ya que un producto tendría muchas reseñas, pero una reseña no pertenecería a muchos productos (por lo general).

class Review extends Eloquent 
    public function product()
    
        return $this->belongsTo('Product');
    


class Product extends Eloquent 
    public function reviews()
    
        return $this->hasMany('Review');
    

Por supuesto, esto requeriría que modifique la estructura de su base de datos. Si quisiera dejar la estructura de la base de datos y sus relaciones actuales como están, la otra opción sería aplicar una key restricción en la tabla dinámica, de modo que cuando se elimina una revisión o un producto, puede eliminar en cascada en la tabla dinámica.

// Part of a database migration
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
$table->foreign('review_id')->references('id')->on('reviews')->onDelete('cascade');

Editar: al agregar la restricción, empuja el trabajo de limpieza a la base de datos y no tiene que preocuparse por manejarlo en el código.

Pasos más simples:

En este ejemplo un Account tiene muchos Tags:

Para eliminar las etiquetas, luego la cuenta, haga esto:

// delete the relationships with Tags (Pivot table) first.
$account->find($this->accountId)->tags()->detach();

// delete the record from the account table.
$account->delete($this->accountId);

En la tabla dinámica, asegúrese de tener ->onDelete(‘cascada’);

$table->integer('account_id')->unsigned()->index();
$table->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade');

$table->integer('tag_id')->unsigned()->index();
$table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');

$review->product()->sync([]) también funciona

Sin embargo $review->product()->detach() es mucho más explícito.

Valoraciones y comentarios

Si tienes algún recelo o capacidad de perfeccionar nuestro reseña puedes dejar una apostilla y con placer lo analizaremos.

¡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 *