我有一个看起来像这样的应用程序:
<?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()
函数似乎是一种可接受的解决方案,但有更优雅的方法来实现这一目标吗?
答案 0 :(得分:0)
这不是onDelete级联的目标,相关记录会被删除。如果要检索某些内容,请在删除之前执行此操作。如果我理解正确,您想要检索文件路径,以便也可以删除系统上的文件。
由于您知道要删除的记录,因此查找数据并保存,然后执行删除。只是一个想法。
答案 1 :(得分:0)
oncascade是一个数据库设置...因此数据库正在删除子记录... Yii或任何PHP代码都不“知道”...这就是为什么你的对象没有被删除而beforeDelete / afterDelete是不叫......