2012-02-12 21 views
1

我有一個稍微像這樣的應用方案:的Yii:串聯在一起,刪除相關紀錄文件

<?php 
class Category extends CActiveRecord 
{ 
    public function relations() 
    { 
     return array(
      'posts' => array(self::HAS_MANY, 'Post', 'category_id'), 
     ); 
    } 
    // ... 
} 

class Post extends CActiveRecord 
{ 
    public function relations() 
    { 
     return array(
      'categories' => array(self::BELONGS_TO, 'Category', 'category_id'), 
      'pictures' => array(self::HAS_MANY, 'PostPicture', 'post_id'), 
     ); 
    } 
    // ... 
} 

class PostPicture extends CActiveRecord 
{ 
    public function relations() 
    { 
     return array(
      'post' => array(self::BELONGS_TO, 'Post', 'post_id'), 
     ); 
    } 
    // ... public function deleteFiles() ... 
} 

所有關係,在PHP代碼中定義還存在與適當的外鍵和ON DELETE CASCADE建立數據庫( InnoDB的)。 PostPicture提供了一種刪除關聯文件的方法。

當我通過$category->delete();刪除Category對象時,發生數據庫級別的ON DELETE CASCADE,圖片記錄會在我可以訪問它們之前被刪除,並且我將無法檢索文件系統路徑。

完全禁用外鍵並不是很優雅 - 我必須爲幾乎所有的模型類實現beforeDelete鉤子。

檢索與該類別的帖子相關的所有PostPicture行,並在Category::beforeDelete()中調用它們的deleteFiles函數似乎是一個可接受的解決方案,但有沒有更好的方法來實現這一點?

回答

0

這不是onDelete級聯的相關記錄被刪除的目標。如果您想要檢索某些內容,請在刪除之前進行。如果我理解正確,您想要檢索文件路徑,以便系統上的文件也可以被刪除。

既然你知道你正在刪除的記錄找到了數據並保存它,然後執行刪除。只是一個想法。

0

oncascade是一個數據庫設置...所以數據庫正在刪除子記錄... Yii或任何PHP代碼不會「知道」那...這就是爲什麼你的對象不會被刪除,而beforeDelete/afterDelete不叫...

Copied from here

相關問題