2010-12-15 73 views
0

J'ai trois modèles: Projet, Utilisateur, ProjectsUser. La table ProjectsUser est utilisée pour les relations HABTM entre Project et User. Ceci est remove() méthode du modèle du projet:Comportement incorrect de la méthode 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; 
    } 

et retirer() de commande Projets:

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

Ainsi, alors que je débogage trouvé que le gâteau fait deux requêtes pour suppression() méthode: suppression du projet par project_id de la table des projets et suivant: SUPPRIMER DE projects_users O WH projects_users. user_id = 4 Cela signifie que si l'utilisateur a deux projets puis après requête toutes les relations dans la table projects_users pour user_id seraient supprimées. Comment puis-je résoudre ce problème et pourquoi Cake supprime de projects_users par user_id et non par project_id?

+2

Pouvez-vous poster le code d'association de modèle pour l'utilisateur et du projet. – Leo

+2

Veuillez utiliser 'return $ this-> delete ($ project_id);' à la place de cette construction redondante de 6 lignes que vous avez là. :) – deceze

Répondre

1

CakePHP cascades est supprimé par défaut, ce qui signifie qu'il tentera de supprimer toutes les données liées à l'enregistrement que vous essayez de supprimer.

Pour éviter ce problème, modifiez votre ligne dans le modèle de produit à:

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

En outre, comme mentionné @deceze, $ this-> delete() renvoie true/false en fonction du succès de la supprimer, il est sûr d'avoir votre fonction entière soit:

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

Plus d'informations sur delete() ici: http://book.cakephp.org/view/1036/delete