У меня есть схема приложения, которая выглядит примерно так:
<?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()
кажется приемлемым решением, но есть ли более элегантный способ добиться этого?