2011-09-23 3 views
2

J'ai lutté avec defining cascade behavior dans Doctrine ORM.Comment cascader des suppressions avec Doctrine 1.2?

Selon the documentation, on est censé utiliser onDelete: CASCADE pour la cascade au niveau de la base de données (ce que j'essaie de réaliser ici).

Un exemple complet peut être vu sur le Symfony tutorial.

Cependant, toutes ces spécifications en cascade sont ignorées dans mon schéma.

Voici l'extrait pertinent:

Advancement: 
    columns: 
    association_id: 
     type: integer(4) 
     notnull: true 
    task_id: 
     type: integer(4) 
     notnull: true 
    state: 
     type: enum 
     values: ['todo', 'current', 'done', 'cancelled'] 
     notnull: true 
    relations: 
    Association: 
     class: Association 
     local: association_id 
     foreignType: one 
     onDelete: CASCADE 
    Task: 
     class: Task 
     local: task_id 
     foreignType: one 
     onDelete: CASCADE 

Bien sûr, les tables et tâches sont correctement définis Association. Je ne les publierai pas ici en premier lieu pour éviter une trop longue question, mais s'il vous plaît demandez si cela semble nécessaire.

Voici le SQL généré (linebreaks mines):

CREATE TABLE advancement 
(id INTEGER PRIMARY KEY AUTOINCREMENT, 
association_id INTEGER NOT NULL, 
task_id INTEGER NOT NULL, 
state VARCHAR(255) NOT NULL); 

Pas trace d'un CASCADE (ni REFERENCES, par la voie ...). Bien sûr, la cascade ne fonctionne pas, et j'ai dû l'implémenter manuellement en modifiant les actions backend par défaut.

Est-ce que quelqu'un sait ce que je fais mal ici?

+0

Doctrine génère les relations de clés étrangères à la fin du sql généré (data/sql/schema.sql), vérifiez si elles sont présentes. – Maerlyn

+0

Non, j'ai en fait 'grep'ped à travers tout le SQL généré, et aucune trace de' CASCADE' ... Merci pour la précision si! – MattiSG

Répondre

1

Je pense que la doctrine va se taire sur le fait que votre SGBDR (est-ce MySQL?) Ne supporte pas les cascades si ce n'est pas le cas. C'est le cas si vous utilisez MySQL avec le moteur de stockage MyISAM (qui ne supporte pas non plus REFERENCES, soit dit en passant ...). Si j'étais vous, j'essaierais de créer une cascade directement avec votre client SGBDR, juste pour vérifier si c'est possible ou non.

+0

Doctrine utilise automatiquement innodb en cas de mysql. – Maerlyn

+0

J'utilise SQLite3 (3.6.12), de sorte que [ne devrait pas être un problème] (http://www.sqlite.org/foreignkeys.html#fk_actions) :) – MattiSG

+0

avez-vous essayé de créer un, juste pour voir si cela fonctionne pour votre version? – greg0ire

Questions connexes