2017-07-13 1 views
0

J'essaye de supprimer des données de deux tables qui sont associées les unes aux autres mais je veux savoir comment il peut être écrit plus efficacement dans phalcon comme je le fais maintenant à travers la méthode de boucle PHP normale.Avec quelle efficacité cette action de contrôleur peut-elle être écrite plus dans phalcon?

Voici le code d'action comme:

public function deletepollAction($pollId) 
    { 

     $poll = new Polls(); 
     $data = $poll->findFirst($pollId); 
     $data->delete(); 
     $options = PollsOptions::find(); 
     foreach ($options as $singleoption) { 
     if ($singleoption->polls_id == $pollId) 
     { 
     $option = new PollsOptions(); 
     $data = $option->findFirst($singleoption->id); 
     $data->delete(); 
     } 
     } 
     $this->response->redirect("/poll"); 
    } 

Je voudrais savoir une méthode propre et efficace et facile à faire dans les méthodes de modèle Phalcon etc? Cela fonctionne comme vous pouvez le voir, mais le problème est qu'il affecte mes vitesses d'exécution (la performance de la page Web va du chargement en une seconde pour effectuer l'action, puis redirige vers la page va à plus comme 2 secondes) comme je dirais ou plutôt plus de 500ms à 1000ms etc et que je ne veux pas. Je veux maintenir la vitesse rapide et résoudre ce problème sans utiliser la boucle qui à son tour itère sur les enregistrements qui ne sont pas liés à l'enregistrement parent qui gaspille du temps. Je veux dire que je veux strictement obtenir tous les enregistrements associés de la table enfant et supprimer ceux directement sans compromettre la performance (temps).

+0

Cette question pourrait être plus approprié pour [Code revue] (http://codereview.stackexchange.com) –

+0

@RobbieAverill: Merci pour votre suggestion, je ne savais pas à propos de la révision de code, et serait-ce vrai si je pense que j'obtiendrai une réponse ici bientôt que là? –

+0

Vous pouvez le faire, mais aussi, sauf si vous avez un problème avec votre code, cette question peut être fermée comme "hors sujet" –

Répondre

3

Vous pouvez créer une relation dans la classe de modèle. Vous pouvez ensuite définir des actions en cascade pour supprimer automatiquement les enregistrements associés.

Création de la relation et le réglage de la mise en cascade

class Polls extends \Phalcon\Mvc\Model 
{ 
    public function initialize() 
    { 
     $this->hasMany(
      'id', 
      'PollsOptions', 
      'polls_id', 
      [ 
       'foreignKey' => [ 
        'action' => \Phalcon\Mvc\Model\Relation::ACTION_CASCADE 
       ] 
      ] 
     ); 
    } 
} 

Mise à jour du contrôleur

Vous n'avez plus besoin de faire autre chose que de supprimer le registre du scrutin.

public function deletepollAction($pollId) 
{ 
    $poll = new Polls(); 
    $data = $poll->findFirst($pollId); 
    $data->delete(); 
    $this->response->redirect("/poll"); 
} 

Lire et en savoir plus sur ce ici:

https://docs.phalconphp.com/en/3.2/db-models-relationships#cascade-restrict-actions

1
public function deletepollAction($pollId) 
{ 
    $data = Polls::findFirst($pollId); 
    $data->delete(); 
    $options = PollsOptions::find([ 
     'polls_id = :pollsId:', 
     'bind' => [ 
      'pollsId' => $pollId 
     ] 
    ]); 
    $options->delete(); 
    $this->response->redirect("/poll"); 
} 

Vous ne savez pas pourquoi vous trouvez ce PollsOptions une fois et puis vous les trouvez à nouveau pour la suppression? Cela n'a pas de sens. Aussi mieux qui se trouve juste à la base de données en cascade supprimer PollsOptions lorsque Polls est supprimé alors vous aurez seulement:

public function deletepollAction($pollId) 
{ 
    $data = Polls::findFirst($pollId); 
    $data->delete(); 
    $this->response->redirect("/poll"); 
} 
+0

C'est aussi une meilleure approche. Merci pour votre réponse.! –