Загадка CakePHP - Экономия в отношениях HasMany

Хорошо, я связываю себя здесь узлами - мне нужны более ясные головы, чем моя, чтобы разобраться в самой сути проблемы!

У меня есть модель Livesession, в которой есть много треков сессий.

Кто-то редактирует живую сессию вместе с информацией о сессиях, которая отправляется пользователем в той же форме.

В настоящий момент, и это может быть слишком сложно, я делаю следующее:

$temp = array();
foreach ($this->data['Sessiontracks'] as $track) {
    if (!empty($track['name']) && !empty($track['starts_at'])) {
        $temp[] = $track;
    }
}
$this->data['Sessiontracks'] = $temp;

$this->Livesession->Sessiontracks->deleteAll(
  array('livesession_id'=>$this->data['Livesession']['id'])
);
if ($fileok && this->Livesession->saveAll($this->data)) {
    // success!
} else { // failure! }

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

Я не могу удалить информацию о сессионных треках после того, как сохраню ее; и если я не удаляю его вообще, я получаю дублирующуюся и / или ошибочную информацию в таблице сессионных треков. Но я действительно не хочу, чтобы пользователь вводил огромное количество информации о треках и рисковал потерять ее при попытке неправильного редактирования.

Возможно, я мог бы сохранить старую информацию о сеансах и сохранить ее обратно в таблицу после deleteAll, если saveAll не удастся? Тем не менее, я определенно чувствую, что, вероятно, выбрал совершенно неправильный путь, и не хочу копаться глубже.

Как лучше всего сохранить данные, связанные с Livesession, даже в случае сбоя сохранения?


person thesunneversets    schedule 02.08.2011    source источник


Ответы (1)


просто $ids = find('list',array('conditions'=>array(..))) перед сохранением All, затем deleteAll(array('conditions'=>array('Model.id'=>$ids))) после успешного сохранения.

person Anh Pham    schedule 02.08.2011
comment
Ага, спасибо! Это очень разумный и логичный подход (и работает как шарм). Ненавижу, когда я так увлекаюсь чем-то, что не могу найти, казалось бы, очевидное решение ...: - / - person thesunneversets; 03.08.2011