Fuelphp Сохранить отношение удаления, Observer вызывает before_update, но не before_delete

У меня есть наблюдатель в отношениях has_many следующим образом:

Post has_many Comments

и Comments активировал следующие Observer:

class Observer_Comments
{
    public function before_delete($model)
    {
        Log::info("Deleted a comment");
    }
    public function before_update($model)
    {
        Log::info("Updated a comment");
    }
}

Когда я обновляю свою модель Post следующим образом:

$post = Post::find(1)->related('comments);
unset($post->comments[1]);
$post->save();

Мой журнал не показывает никакой активности. Comment удаляется, а Post корректно обновляется, включая запуск любого из его наблюдателей.

Когда я удаляю комментарий явно:

$comment = Comment::find(1);
$comment->delete();

то журнал показывает, что я ожидаю:

INFO --> Deleted a Comment

Есть ли настройка cascade, которую я должен использовать?


ОБНОВИТЬ

Я вижу этот код внутри Model::save():

1127    if (method_exists($rel, 'delete_related'))
1128    {
1129        $rel->delete_related($this);
1130    }

Нужно ли добавлять метод delete_related в мою модель Post или Comments?


person willoller    schedule 15.07.2013    source источник


Ответы (1)


Unset() не удаляет связанный объект, он сбрасывает связь между ними.

В случае много-много это также будет означать, что запись в соединительной таблице, связывающая их, будет удалена, в других отношениях внешний ключ будет сброшен в NULL.

Обе операции не изменяют данные объекта, поэтому ОБНОВЛЕНИЕ не будет запущено для объекта, и, следовательно, наблюдатели не будут вызываться.

«Каскад» означает, что если вы удаляете объект, удаление будет «каскадировать» к связанному объекту, удаляя и его. Но только если вы удалите «родителя» в отношении, а не когда вы его отключите (что ничего не удаляет).

person WanWizard    schedule 19.07.2013
comment
Ах, я вижу, что отношения не установлены, но запись не удалена. Хорошо, имеет смысл. Как я могу настроить это так, чтобы элемент был удален (или мягко удален)? - person willoller; 20.07.2013
comment
установите для 'cascade_delete' значение true в определении отношения. - person WanWizard; 22.07.2013
comment
Поправьте меня, если я ошибаюсь, но я думаю, что это будет применяться только в том случае, если я удалю родительскую запись, а не просто удалю связь. - person willoller; 23.07.2013
comment
Если вы хотите удалить элемент, просто удалите его? Он будет удален из любых отношений автоматически, если это актуально. - person WanWizard; 01.09.2013