2012-10-15 20 views
5

Ciao ho la seguente classeDoctrine 2 cascade = { '' rimuovere "} non sembra funzionare

/** 
* MP\User\RegistrationBundle\Entity 
*/ 
namespace MP\User\RegistrationBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\Common\Persistence\PersistentObject; 
use MP\Services\SiteAdapterBundle\Util\String; 
/** 
* @ORM\Table(name="customer") 
* @ORM\Entity(repositoryClass="MP\User\RegistrationBundle\Repositories\CustomerRepository") 
* @ORM\HasLifecycleCallbacks 
*/ 
class Customer extends PersistentObject 
{ 

    /** 
    * @var string $id 
    * @ORM\Id 
    * @ORM\Column(name="icustomer_id", type="integer") 
    */ 
    protected $id; 

    /** 
    * @var string $addresses 
    * @ORM\OneToMany(targetEntity="MP\User\RegistrationBundle\Entity\Address", mappedBy="customer", cascade={"remove"}) 
    */ 
    protected $addresses; 

Con la seguente relazione

/** 
* MP\User\RegistrationBundle\Entity 
*/ 
namespace MP\User\RegistrationBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Persistence\PersistentObject; 

/** 
* @ORM\Table(name="custdeladd") 
* @ORM\Entity(repositoryClass="MP\User\RegistrationBundle\Repositories\AddressRepository") 
*/ 
class Address extends PersistentObject 
{ 
     /** 
     * @var integer $suffix 
     * @ORM\Column(name="isuffix", type="integer") 
     * @ORM\Id 
     */ 
     protected $suffix; 

     /** 
     * @var object $customer 
     * @ORM\ManyToOne(targetEntity="MP\User\RegistrationBundle\Entity\Customer", inversedBy="addresses", cascade={"persist"}) 
     * @ORM\JoinColumn(name="icustomer_id", referencedColumnName="icustomer_id") 
     */ 
     protected $customer; 
} 

Qualcuno sa perché quando il il cliente viene eliminato gli indirizzi non lo sono? Molte grazie

+0

cascade = { "rimuovere"} ha lavorato per me – jmoz

risposta

28

La definizione della tua relazione sembra essere soddisfacente.Qual è il modo in cui il cliente viene eliminato? Voglio dire che Doctrine non imposta "ON DELETE CASCADE" direttamente nel database. se lo sei rimuovi l'entità cliente in modo diverso da quello di "doctrine", i commenti non verranno cancellati.

Puoi dire la dottrina di impostare questo direttamente nel database, aggiungendo in nota:

@ORM\JoinColumn(name="icustomer_id", referencedColumnName="icustomer_id", onDelete="CASCADE") 

Ma se si sta cercando rimuovere l'entità destro dottrina modo formica questo ancora non funziona, provare aggiungere "orphanRemoval" per vero, dovrebbe aiutare:

// Customer.php 
/** 
* @var string $addresses 
* @ORM\OneToMany(targetEntity="MP\User\RegistrationBundle\Entity\Address", mappedBy="customer", cascade={"remove"}, orphanRemoval=true) 
*/ 
protected $addresses; 
+1

Grazie mille, la mappedBy = "cliente", cascade = { "rimuovere"}, orphanRemoval = true giga sul OneToMany ha fatto il trucco, sono sicuro che provato prima, ma .. – Richard

5

ho avuto un po 'di problemi a far funzionare tutto questo. Ecco alcuni punti che potrebbero aiutare quelli che hanno problemi simili:

  1. L'entità proprietaria ha la necessità @OneToMany(... cascade={"remove"} o cascade={"all"})
  2. L'entità bambino ha bisogno anche @JoinColumn(... onDelete="CASCADE")
  3. Inoltre, se si sta modificando la parte onDelete="CASCADE" credo dovrai per aggiornare lo schema prima che le modifiche abbiano effetto.