trucos tips laravel orm many-to-many eloquent

tips - Laravel Eloquent ORM: muchos a muchos eliminan los valores de tabla dinámica que quedan



tips laravel (3)

Usando Laravel, tengo el siguiente código

$review = Review::find(1); $review->delete();

Review tiene una relación de muchos a muchos definida con una entidad de Product . Cuando elimino una revisión, esperaría que se separara de los productos asociados en la tabla dinámica, pero este no es el caso. Cuando ejecuto el código anterior, todavía veo la fila de enlace en la tabla dinámica.

¿Me he perdido algo aquí o es así como funciona Laravel? Soy consciente del método detach() , pero pensé que eliminar una entidad también lo separaría de cualquier entidad relacionada automáticamente.

Review se define así:

<?php class Review extends Eloquent { public function products() { return $this->belongsToMany(''Product''); } }

Product se define así:

<?php class Product extends Eloquent { public function reviews() { return $this->belongsToMany(''Review''); } }

Gracias por adelantado.


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. Mi entendimiento es que la eliminación no activará implícitamente la separación. 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 revisiones, pero una revisión no pertenecería a muchos productos (generalmente).

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á que modifiques la estructura de tu base de datos. Si desea dejar la estructura de la base de datos y sus relaciones actuales tal como están, la otra opción sería aplicar una restricción de clave externa en la tabla dinámica, de modo que cuando se elimine una revisión o un producto, podría eliminar en cascada la eliminación 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'');

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


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

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


Pasos más simples:

En este ejemplo, una Account tiene muchas Tags :

Para eliminar las etiquetas, entonces la cuenta hace 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 (''cascade'');

$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'');