ORM Doctrine ManyToOne on update CASCADE (Symfony))

j'ai deux entités

class Promotor
{

/**
 * @ORMManyToOne(targetEntity="Ciudad", inversedBy="promotor")
 * @ORMJoinColumn(name="ciudad_id", referencedColumnName="id", nullable=false)
 */
protected $ciudad;

et

class Ciudad
{
/**
 * @var integer
 *
 * @ORMColumn(name="id", type="integer")
 * @ORMId
 * @ORMGeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORMColumn(name="nombre", type="string", length=50)
 */
private $nombre;

un" promoteur "peut vivre dans une "Ciudad" (ville). Et dans une " Ciudad "(ville) peut vivre beaucoup de"Promotores".

si j'ajoute onDelete= "CASCADE" dans JoinColumn

/**
 * @ORMManyToOne(targetEntity="Ciudad", inversedBy="promotor")
 * @ORMJoinColumn(name="ciudad_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
 */
protected $ciudad;

il génère le code suivant

ALTER TABLE promotor DROP FOREIGN KEY FK_BF20A37FE8608214;
ALTER TABLE promotor ADD CONSTRAINT FK_BF20A37FE8608214 FOREIGN KEY (ciudad_id)
REFERENCES Ciudad (id) ON DELETE CASCADE

mais j'aime aussi faire CASCADE sur update. J'ai essayer avec onUpdate="CASCADE", mais il n''

[DoctrineCommonAnnotationsAnnotationException]
[Creation Error] The annotation @ORMJoinColumn declared on property     WebPromotorBundleEntityPromotor::$ciudad does not have a property named
"onUpdate". Available properties: name, referencedColumnName, unique, nulla
ble, onDelete, columnDefinition, fieldName

par l'erreur je comprends que la propriété onUpdate ne n'existe pas, mais.. Y a-t-il un moyen de faire cascade sur update?

9
demandé sur JGrinon 2013-04-24 23:55:36

1 réponses

l'onDelete="CASCADE" est utilisé au niveau de la base de données. Comme vous l'avez déjà dit il n'y a pas de onUpdate. Un autre inconvénient est que sur DELETE CASCADE ne fonctionne que sur InnoDB. Ça ne marche pas sur MyISAM.

Mais vous pouvez utiliser de la Doctrine en mémoire cascade d'opérations:

class Promotor
{

/**
* @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor", cascade={"persist", "remove"})
* @ORM\JoinColumn(name="ciudad_id", referencedColumnName="id", nullable=false)
*/
protected $ciudad;

tout est décrit dans la documentation: http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#transitive-persistence-cascade-operations

de Plus, vous pouvez sauter l' JoinColumn annotation, parce que la façon dont vous l'avez écrit, est la configuration par défaut et elle est générée implicitement.

alors vous pouvez simplement écrire:

class Promotor
{

/**
* @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor", cascade={"persist", "remove"})
*/
protected $ciudad;
10
répondu alsar 2013-04-25 11:11:19