2009-08-20 4 views
2

J'essaie de supprimer une liste d'entrées de ma table correspondant à un identifiant particulier. Je reçois l'identifiant et l'envoie via une fonction ajax au contrôleur et utilise la fonction Delete du modèle pour supprimer l'entrée particulière. Mais les entrées ne sont pas supprimées.Suppression d'un champ autre que l'ID principal

Ceci est ma fonction ajax dans le fichier de vue appelé reports.ctp où j'appelle la fonction de contrôleur quand un lien est cliqué.

$(".delete_entries").click(function() { 
    $.ajax({ 
     type: "POST", 
     url: "http://localhost/FormBuilder/reports/deleteEntries", 
     data: "formid="+formid, 
     async: false, 
     success: function(msg){ 
      alert("Data Saved: " + msg); 
     } 
    });//ajax 
}); 

C'est l'action de suppression dans le reports_controller.php

function deleteEntries() 
{ 
    $this->data['Result']['form_id']=$this->params['form']['formid']; 
    $this->Report->Result->delete($this->data['Result']['form_id']); 
} 

Le tableau dont je veux supprimer les entrées est « Résultats ». quelqu'un m'aide à supprimer les entrées.

EDIT

Maintenant, je suis en utilisant la requête SQL suppression en tant que telle pour supprimer les entrées de la table des résultats. Je ne sais pas pourquoi la commande delete de CakePHP ne fonctionne pas. Je ne sais pas pourquoi la commande delete de CakePHP ne fonctionne pas.

Mais maintenant le problème est, seulement quand j'actualise la page, la suppression des entrées sont reflétées. Si je ne rafraîchis pas, les entrées sont toujours affichées dans la table. Peut-être que si la fonction de suppression de CakePHP fonctionne, la page sera rafraichie.

SOLUTION

La méthode fonctionne deleteAll puisque je ne suis pas donner l'identifiant primaire comme entrée pour la méthode de suppression comme deceze a souligné. $ This-> Résultat-> deleteAll (array ('Result.form_id' => $ this-> data ['Result'] ['form_id'])); En ce qui concerne le problème de refléter la suppression des entrées, j'ai fait un $ (". Entrées) .remove() sur le succès comme Xr l'avait suggéré, donc la table des entrées est supprimée sans avoir à faire une actualisation de page

Répondre

5
"delete from results where form_id=".$this->data['Result']['form_id'] 

Le problème est que vous voulez supprimer sur un terrain autre que le principal id. La méthode Model::delete() s'attend à ce que vous lui donniez le champ principal id.

Lorsque vous essayez de faire

$this->Report->Result->delete($this->data['Result']['form_id']); 

même si vous mettez le form_id dans un tableau agréable d'abord, le résultat est ceci:

$this->Report->Result->delete(25); // let's say 'form_id' is 25 

Cela dit delete() supprimer le Result avec le id 25, il ne sait pas que vous voulez supprimer en fonction d'un critère différent, ni il se soucier. Ce que vous cherchez est Model::deleteAll().

deleteAll(mixed $conditions, $cascade = true, $callbacks = false)

Comme avec del() et remove(), sauf que deleteAll() supprime tous les enregistrements correspondant aux conditions fournies. Le tableau $ conditions doit être fourni en tant que fragment ou tableau SQL.

Vous devriez être en mesure de faire quelque chose comme ça avec elle:

$this->Result->deleteAll(array('Result.form_id' => $this->data['Result']['form_id'])); 
+0

Eh bien, j'ai essayé deleteAll hier .. Mais n'a pas été supprimé. Je vais essayer encore une fois. – Angeline

+0

oui, deleteAll fonctionne parfaitement .. Auparavant, j'avais donné en tant que tableau ('conditions' => tableau ('Result.form_id' => $ this-> données ['Result'] ['form_id'])) .. c'est pourquoi il n'a pas supprimé les entrées je suppose .. THank You .. – Angeline

1
$this->Report->delEntries($data); 

ne devrait pas être ce

$this->Report->delEntries($this->data); 

Je ne regarde pas beaucoup plus loin que cela, mais les données $ ne ressemble pas à elle est définie dans deleteEntries().

+0

J'ai changé cela pour $ this-> data. Mais ça ne marche toujours pas. Je ne reçois pas les données dans le modèle. – Angeline

+0

Ensuite, si $ this-> params ['form'] ['formid'] a la bonne valeur (je suppose que la variable Javascript 'formid' est définie mais que votre code ne la mentionne pas), je ne sais pas savoir pourquoi les données ne sont pas transmises au modèle. En remarque, à moins que vous n'ayez réellement plus de logique que ce que vous avez collé ici, vous pouvez aussi lancer $ this-> Report-> Result-> delete ($ this-> params ['form'] ['formid']) directement à partir de ReportsController. –

+0

@Xr: Aucune raison spécifique pour avoir la commande delete dans le modèle. Juste pensé que peut-être la commande de suppression ne fonctionne que dans le modèle. Maintenant que j'ai changé comme vous l'avez dit, l'entrée n'est toujours pas effacée. – Angeline

0

fonction deleteEntri es() {

 App::import('Sanitize'); 
    $post = Sanitize::clean($_POST); 

    //very important to set cascade to false 
    $this->Result->delete($post['form_id'],false); 

}

+1

C'est seulement important si vous ne voulez pas qu'il cascade, pas en règle générale. – deceze

0

Votre deuxième problème peut être mieux placé dans une autre question, mais voilà:

Comme on l'a avant , la table ne changera pas comme par magie simplement parce que votre base de données a changé. Vous devrez actualiser la page ou supprimer l'entrée supprimée via Javascript. Tout d'abord, votre méthode de contrôleur doit renvoyer si la suppression a réussi. Vous pouvez tout simplement faire:

function delete() { 
    $this->layout = 'ajax'; 

    if ($this->Result->deleteAll(...)) { 
     echo "success"; 
    } else { 
     echo "failure"; 
    } 
} 

Pour être bon MVC, vous devez retourner cette valeur dans une vue, de préférence au format JSON, mais il va le faire pour l'exercice.

Sur votre site, disons que vous avez cette table:

<table> 
    <tr> 
    <td>Id: 25</td><td>My result</td><td><a class="delete_entries">Delete Entries</a></td> 
    <tr> 
    ... 
</table> 

Dans votre Javascript, qui est attaché à un lien dans la ligne, votre rappel success ressemblerait à quelque chose comme ceci:

$(".delete_entries").click(function() { 

    // save a reference to the link, "this" will be something else in the callback 
    var deleteLink = this; 

    $.ajax({ 
     ... 
     success: function(data){ 
      if (data == "success") { 
       // remove the row in which the link resides 
       $(deleteLink).parents('tr').remove(); 
      } 
     } 
    } 
} 
Questions connexes