2010-12-15 2 views
0

У меня есть три модели: Project, User, ProjectsUser. Таблица ProjectsUser используется для отношений HABTM между Project и Пользователь. Это удалить() метод модели проекта:Неправильное поведение метода delete()

function remove($project_id, $user_id) 
    { 
     /* 
     * Проверяем, относится ли выбранный проект к пользователю 
     */ 
//  $data = $this->read('', $project_id); 
// 
//  if($data['User'][0]['id'] != $user_id) 
//  { 
//   return false; 
//  } 
     /* 
     * Если проект принадлежит пользователю, то удалить его 
     */ 
     $result = $this->delete($project_id); 
     if(!$result) 
     { 
      return false; 
     } 
     return true; 
    } 

и удалить() метод управления проектами:

 function remove($project_id) 
     { 
      /* 
      * Пробуем удалить проект 
      */ 
      $user_id = $this->Session->read('Auth.User.id'); 
      $result = $this->Project->remove($project_id, $user_id); 
      /* 
      * Если возникли ошибки, то отправить их в буфер сообщений 
о результате операций 
      */ 
      if(!$result) 
      { 
       $this->Session->setFlash('Возникли проблемы при 
удалении проекта, попробуйте позже'); 
       $this->redirect(array( 
        'controller' => 'projects', 
        'action' => 'index', 
       )); 
      } 
      $this->Session->setFlash('Проект успешно удален'); 
//   $this->redirect(array( 
//    'controller' => 'projects', 
//    'action' => 'index', 
//   )); 
     } 

Таким образом, в то время отладки я обнаружил, что торт делает два запроса для удаления() метод: удаление проекта по проекту_id из таблицы проектов и следующее: УДАЛИТЬ ОТ projects_users ГДЕ projects_users. user_id = 4 Это означает, что если у пользователя есть два проекта, то после запроса все отношения в таблице projects_users для user_id будут удалены. Как я могу исправить это и почему Cake удаляет из project_users по user_id не по project_id?

+2

вы можете разместить код модели ассоциации для пользователя и проекта. – Leo 2010-12-15 18:40:17

ответ

1

Каскады CakePHP по умолчанию удаляются, что означает, что он попытается удалить все связанные данные в запись, которую вы пытаетесь удалить.

Чтобы предотвратить такое поведение, изменить линию в модели продукта, чтобы:

$result = $this->delete($project_id, false); 

Кроме того, в качестве @deceze упоминалось, $ this-> Удалить() возвращает истину/ложь в зависимости от успеха из удалять, так что это безопасно, чтобы вся ваша функция будет:

function remove($project_id, $user_id) 
{ 
    // do any checks for $user_id here... 
    // ... 
    $result = $this->delete($project_id, false); 
    return $result; 
} 

Больше информации о удалении() здесь: http://book.cakephp.org/view/1036/delete