Yii: Каскадное удаление связанной записи вместе с файлом - PullRequest
1 голос
/ 13 февраля 2012

У меня есть схема приложения, которая выглядит примерно так:

<?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 голосов
/ 04 марта 2012

oncascade - это параметр базы данных ... так как база данных удаляет дочерние записи ... Yii или любой PHP-код не "знает" об этом ... вот почему ваш объект не удален, а beforeDelete / afterDeleteне вызывается ...

Скопировано отсюда

0 голосов
/ 28 февраля 2012

Разве это не цель каскада onDelete, чтобы связанные записи были удалены. Если вы хотите получить что-то, сделайте это до удаления. Если я правильно понимаю, вы хотите получить пути к файлам, чтобы файлы в системе также могли быть удалены.

Поскольку вы знаете, какие записи вы удаляете, найдите данные и сохраните их, а затем выполните удаление. просто мысль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...