Eliminar u ocultar registros en la BD

Hola a todos. Estoy migrando un proyecto que tengo echo en php crudo a SF2 (soy muy nuevo con el uso del framework), como quiero hacer lo correcto tengo la siguiente duda:

En mi proyecto actual (php crudo) cuando el usuario desea eliminar algo que había cargado (ej: un mensaje, un comentario, un link, una task, etc.) el sistema no lo elimina de la BD, solo le cambiaba el estado (el atributo estado se marca como "eliminado"). El sistema solo muestran las entidades que no están marcadas como eliminadas. De esta forma me permite recuperar cualquier elemento "borrado" por el usuario. La contra es que estoy engañando al usuario, ya que no estoy eliminando el registro.

Al migrar el sistema a SF2 me surge la duda de que es lo que debería hacer, si seguir con la misma metodología o realmente eliminar el registro de la BD. Si lo correcto es esta última opción (eliminarlo) me surgen lo siguientes problemas:

  • ¿Cómo eliminar una entidad que esta vinculadas con otras entidades? (Ej. Tengo un colección de objetos categoría y otra colección de objetos productos. Dentro de categoría tengo la entidad "Gaseosas" y dentro de productos tengo las entidades: "Coca-Cola", "Pepsi", "Fanta", etc. todas están relacionadas con la entidad "Gaseosas" de la clase Categorías. Si quiero eliminar "Fanta" no tengo problemas, pero cuando quiero eliminar la entidad "Gaseosas" me salta un error de integridad en mi BD, ya que hay objetos que se relacionan con dicha entidad. En este caso como debería hacer para poder eliminar toda una categoría sin antes eliminar todas las entidades productos que dependen de ellas? y si en vez de tener 2 niveles tengo más como se daría en el caso de Países / Provincias / Ciudades / Calles?)

  • ¿Si quiero tener una forma de recuperar las entidades borradas, que seria lo ideal (tener la BD duplicada y solo en una de ellas se borran las entidades, tener duplicadas las clases en una mismas BD, tener una entidad especial "Eliminadas" donde se copien los objetos a esta entidad antes de borrarlos de la entidad original)?

Desde ya agradezco sus comentarios y/o sugerencias.

Respuestas

#1

Trataré de ayudarte un poco:

1.- Para eliminar las entidades asociadas Doctrine 2 tiene un parámetro que te permite borrar en cascada la entidad asociada y con solo adicionar en la anotación de tu relación haría esta tarea automáticamente por ti.

Ejemplo de como en la entidad Empresa de mi aplicación elimino todos los usuarios asociados a dicha empresa:

class Empresa {
 
 /**
  * @OneToMany(targetEntity="User", mappedBy="empresa", cascade={"remove"})
  */
    private $usuarios;
_____________________________________________________________
 
class User {
 
 /**
   * @ManyToOne(targetEntity = "Empresa", inversedBy = "usuarios")
   * @JoinColumn(name = "empresa_id", referencedColumnName = "id", onDelete = "SET NULL")
   */
    private $empresa;

2.- Para hacer esto que quieres las soluciones que presentas son válidas pero sin tener que hacer mucho esfuerzo de nuevo llega Doctrine2 a ayudarte con una extensión "SoftDeleteable" que precisamente hace lo que quieres marca tu entidad con un campo "fieldName" que define el tipíco "deleteAt" y en las consultas SELECT tiene en cuenta este campo para listar.

A continuación el link SoftDeleteable

Espero te hayan ayudado las respuestas. Cualquier duda podes dejarla por aca para ver como nos ayudamos. Saludos

#2

Gracias Rober, fue de mucha ayuda tu sugerencia.