2010-07-13 7 views
0

J'utilise Doctrine 1.2 dans mon projet. Le fichier schema.yml contient:Doctrine cascade: [delete] n'appelle pas delete() méthode des objets associés

Campaign: 
    tableName: campaign 
    actAs: 
    Timestampable: 
     created: 
     name: created_datetime 
     type: timestamp 
     format: Y-m-d H:i:s 
     updated: 
     disabled: true 
    columns: 
    id: 
     type: integer(9) 
     fixed: false 
     unsigned: false 
     primary: true 
     autoincrement: true 
    ... 
    relations: 
    CampaignImages: 
     local: id 
     foreign: campaign_id 
     type: many 
     cascade: [delete] 
    ... 
CampaignImages: 
    tableName: campaign_images 
    columns: 
    id: 
     type: integer(9) 
     fixed: false 
     unsigned: false 
     primary: true 
     autoincrement: true 
    campaign_id: 
     type: integer(9) 
     fixed: false 
     unsigned: false 
     primary: false 
     notnull: true 
     autoincrement: false 
    ... 

Je définis CampaignImages :: delete() méthode et de mettre un code de débogage là-bas, mais il ne sera pas exécutée lors de la campagne :: delete() est appelée.

N'est-ce pas la cascade: [delete] signifie précisément pour cette raison? Je ne souhaite pas utiliser les cascades au niveau de la base de données, car les fichiers image associés à CampaignImage doivent être supprimés lors de la suppression de l'enregistrement.

Répondre

2

La suppression en cascade n'exécute pas la méthode delete(). Cependant, il garantit que les hooks sont exécutés.

Si vous devez implémenter une logique de pré/post-suppression, vous ne devez pas écraser la méthode delete() mais plutôt utiliser les hooks preDelete() ou postDelete().

+0

Merci Kuba, je cherchais juste cette. – fest

1

J'ai résolu d'une autre manière

dans la classe de campagne vous mettez ce

public function setUp() { 
     parent::setUp(); 

     // to delete cascaded items 
     $CampaignRel = $this->_table->getRelation("CampaignImages"); 
     $CampaignRel->offsetSet('cascade', array('delete')); 
    } 

il m'a fait un travail pour cette façon