2011-10-14 16 views
10

Hola Tengo un problema al intentar eliminar en cascada entidades en OneToMany relaciones. Después de algunas horas de depuración intenté degradar la doctrina de la última versión 2.1.2 a 2.0.2 y de repente comienza a funcionar.Doctrine 2.0 vs 2.1 cascada eliminar OneToMany

Imagin dos entidades Empresa y dirección en relación 1: N.

/** 
* @Entity 
*/ 
class Company extends Entity 
{ 

/** 
    * @var integer 
    * @id @Column(type="integer") 
    * @generatedValue 
    */ 
private $id; 

/** 
    * @var Collection 
    * @OneToMany(targetEntity="Address",mappedBy="company", cascade={"persist","remove"}) 
    */ 
private $addresses; 
} 



/** 
* @Entity 
*/ 
class Address extends Entity 
{ 

/** 
    * @var integer 
    * @id @Column(type="integer") 
    * @generatedValue 
    */ 
private $id; 

/** 
    * @var Company 
    * @ManyToOne(targetEntity="Company", inversedBy="addresses") 
    * @JoinColumn(name="company_id", referencedColumnName="id",nullable=false) 
    */ 
private $company; 
} 

Cuando intento eliminar la entidad Empresa, me gustaría que también se eliminen las direcciones asignadas.

$em->remove($company); 
$em->flush(); 

En la doctrina 2.1.2 La eliminación de las direcciones no se realiza de modo que la restricción de integridad falla. En la versión 2.0.2 funciona perfectamente. Lo más curioso es que, si uso la extensión EntityAudit https://github.com/simplethings/EntityAudit, LogRevisionListener correlaciona las entidades de direcciones (configúrelas revtype = DEL) en la doctrina 2.1.2 (por supuesto en 2.0.2 también) pero UnitOfWork no lo está eliminando.

¿Hay alguna diferencia en cómo manejar la eliminación de cascada en 2.0.2 y en 2.1.2?

Muchas gracias

+0

Hoy tropecé con este problema, estoy usando 2.1.6. :/ – mokagio

+0

Bueno, tengo que corregirme a mí mismo, ¡me funciona ahora! Estaba usando 'cascade = {" all "}' pero cuando lo cambié en 'cascade = {" remove "}' todo comenzó a funcionar bien. – mokagio

+0

Aunque debo decir que probablemente mi problema no sea completamente debido al conjunto de anotaciones o a Doctrine en sí, porque estoy haciendo una manipulación intensiva de las entidades y, después de algunas pruebas sobre la combinación de las opciones en cascada, descubrí que el La opción '' merge '' fue la que dio problemas. Espero que ayude de todos modos :) – mokagio

Respuesta

1

he encontrado con el mismo problema y he resuelto él con ese código:

$em->remove($object); 
$em->flush(); 
$em->remove($user); 
$em->flush(); 

Tal vez se puede utilizar un findAll en su company para las direcciones y quitar esto con un foreach así:

// Return all the addresses of the company 
$addresses = $em->getRepository(...)->findAllAddressesByCompany($company); 
$em->remove($company); 
foreach ($address in $addresses) 
{ 
    $em->remove($address); 
} 

eso no es un método muy bueno, pero por ahora, eso es todo lo que tengo encontró.

+1

Lo he resuelto degradando la doctrina :) gracias, pero no es el método que estoy buscando :(podría ser probablemente un error (¿o una característica?) – stefi

10

Trate de usar esto en el atributo de la clase addressesCompany

@OneToMany(targetEntity="Address",mappedBy="company", 
cascade={"persist"}, orphanRemoval=true) 
+1

Soy usando la doctrina 2.2.3 y aún lo mismo. Tuve que agregar huérfano Remover = verdadero. Algo extraño porque no elimino un lado para no crear ningún huérfano. Tal vez porque los muchos lados son los dueños y los estoy quitando por un lado. .Las actualizaciones funcionan porque los muchos lados son del lado propietario y ambos estoy usando '$ this-> addSomething (theThing)' y 'theThing-> setSomething ($ this)' donde como si estuviera borrando el texto no hay configuración , solo '$ this-> removeSomething (theThing)' – HMR

3

que tenían el mismo problema ... se añadieron Relaciones o actualizados, pero no eliminado, incluso si tuviera cascada: [persisten , retirar].

Descubrí que no necesitaba el atributo "eliminar" en "cascada", pero tuve que agregar orphanRemoval: true.

¡Me estaba volviendo loco, me alegraste el día!

Cuestiones relacionadas