2010-12-15 7 views
0

Ich habe drei Modelle: Projekt, Benutzer, ProjectsUser. Die Tabelle ProjectsUser wird für HABTM-Beziehungen zwischen Project und User verwendet. Dies ist() -Methode des Projektmodells entfernen:Falsches Verhalten der Methode 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; 
    } 

und remove() Methode der Projekte Controller:

 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', 
//   )); 
     } 

Also, beim Debuggen fand ich, dass Kuchen zwei Anfragen zum Löschen macht() Methode: Löschen Projekt von Projekt-ID aus Projekten Tabelle und die nächste: LÖSCHEN VON projects_users WHERE projects_users. user_id = 4 Dies bedeutet, dass, wenn der Benutzer zwei Projekte hat, nach der Abfrage alle Relationen in der Tabelle projects_users für die Benutzer-ID gelöscht werden. Wie kann ich das beheben und warum Cake löscht von projects_users von user_id nicht von project_id?

+2

können Sie das Modell Zuordnungscode für User & Projekt veröffentlichen. – Leo

+2

Verwenden Sie 'return $ this-> delete ($ project_id);' anstelle dieses überflüssigen 6-Linien-Konstrukts, das Sie dort haben. :) – deceze

Antwort

1

CakePHP kaskadiert, dass es standardmäßig gelöscht wird. Dies bedeutet, dass es versucht, alle zugehörigen Daten im Datensatz zu löschen, den Sie entfernen möchten.

dieses Verhalten zu verhindern, Ihre Linie im Modell Artikel ändern: kehren

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

Auch als @deceze erwähnt, $ this-> delete() true/false je nach Erfolg der löschen, so dass es Ihre gesamte Funktion sicher haben:

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

Weitere Informationen zu löschen() hier: http://book.cakephp.org/view/1036/delete

Verwandte Themen