Yii:级联删除相关记录和文件

时间:2012-02-12 23:04:43

标签: php database 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删除$category->delete();对象时,会发生数据库级别的ON DELETE CASCADE,图片记录在我可以访问之前被删除,我将无法检索文件系统路径。

完全禁用外键不是很优雅 - 我几乎要为每个模型类实现beforeDelete挂钩。

检索与类别帖子相关联的所有PostPicture行并在deleteFiles中调用他们的Category::beforeDelete()函数似乎是一种可接受的解决方案,但有更优雅的方法来实现这一目标吗?

2 个答案:

答案 0 :(得分:0)

这不是onDelete级联的目标,相关记录会被删除。如果要检索某些内容,请在删除之前执行此操作。如果我理解正确,您想要检索文件路径,以便也可以删除系统上的文件。

由于您知道要删除的记录,因此查找数据并保存,然后执行删除。只是一个想法。

答案 1 :(得分:0)

oncascade是一个数据库设置...因此数据库正在删除子记录... Yii或任何PHP代码都不“知道”...这就是为什么你的对象没有被删除而beforeDelete / afterDelete是不叫......

Copied from here