2017-03-03 3 views
0

J'ai deux tables: pas et liens joints 1: n. Je vise à maintenir les liens à travers les objets étape. Je récupère toutes les étapes de la base de données et remplit la relation avec la table des liens. Je persiste l'objet d'étape contenant une collection de liens vers JSON et le renvoie au début en utilisant REST. Cela signifie que si une étape est liée ou reliée à une autre étape dans le frontend, j'envoie tout le pas au backend, y compris une collection de liens. Dans l'arrière-je utiliser le code suivant:PHP/Propel delete enregistrement 1: n

public function put($processStep) { 
     if (isset($processStep['Processesid']) && isset($processStep['Coordx']) && isset($processStep['Coordy'])) { 
      $p = $this->query->findPK($processStep['Id']); 

      $p->setId($processStep['Id']); 
      $p->setProcessesid($processStep['Processesid']); 
      if (isset($processStep['Flowid'])) $p->setFlowid($processStep['Flowid']); 
      if (isset($processStep['Applicationid'])) $p->setApplicationid($processStep['Applicationid']); 
      $p->setCoordx($processStep['Coordx']); 
      $p->setCoordy($processStep['Coordy']); 

      $links = $p->getLinksRelatedByFromstep(); 
      $links->clear(); 

      foreach ($processStep['Links'] as $link) { 
       if (!isset($link['Linkid'])) { 
        $newLink = new \Link(); 

        $newLink->setFromstep($link['Fromstep']); 
        $newLink->setTostep($link['Tostep']); 

        $links->prepend($newLink); 
       } 
      } 

      $p->save(); 

      return $p; 
     } else { 
      throw new Exceptions\ProcessStepException("Missing mandatory fields.", 1); 
     } 
    } 

je supprime essentiellement tous les liens d'une étape et en fonction de l'objet de la demande, je recréer les liens. Cela me sauve l'effort de comparer quels liens sont supprimés et ajoutés. L'insert fonctionne comme un charme Propel crée automatiquement les nouveaux liens. Chose est qu'il ne supprime pas comme il insère. J'ai vérifié l'objet qui est en train de persister ($ p) et je vois que le lien est supprimé mais dans le journal MySQL il n'y a absolument aucune action effectuée par Propel. Il semble qu'un membre manquant de la collection de liens ne déclenche pas un drapeau sale ou quelque chose comme ça.

Peut-être que je vais à ce sujet dans le mauvais sens, j'espère que quelqu'un peut offrir quelques conseils.

Merci

+0

je n; t voir les appels à delete() anywehere dans votre code. Je vous vois seulement en utilisant clear(). clear() efface tous les critères/filtres que vous avez appliqués à la collection, il ne supprimera rien. – chocochaos

+0

Le $ liens var est une instance d'un ObjectCollection, la fonction clear supprime les liens de la collection (selon les docs de l'API) brisant les relations entre une étape et ses liens, du moins c'était mon raisonnement :). En rompant la relation, j'espérais que Propel déclencherait une suppression implicite pour les objets de liens manquants, tout comme elle déclenche une insertion pour les liens qui sont ajoutés à la collection. Si je dois utiliser des appels de suppression explicites, je dois commencer à comparer les liens de l'étape vers le backend et celui de la base de données que j'espérais éviter. Merci pour la contribution! – Remco

Répondre

0

Grâce à Ben, je suis sur la bonne voie, un appel explicite pour une suppression n'est pas nécessaire. Je suis tombé sur une fonction appelée: setRelatedBy (ObjectCollection o) J'utilise cette fonction pour fournir une liste d'objets liés, de nouveaux objets sont interprétés comme des insertions et des omissions sont interprétées comme des suppressions.

Je n'ai pas trouvé aucune documentation pertinente en ce qui concerne le problème alors voici mon code:

$p = $this->query->findPK($processStep['Id']); 

      $p->setId($processStep['Id']); 
      $p->setProcessesid($processStep['Processesid']); 
      $p->setCoordx($processStep['Coordx']); 
      $p->setCoordy($processStep['Coordy']); 
      if (isset($processStep['Flowid'])) $p->setFlowid($processStep['Flowid']); 
      if (isset($processStep['Applicationid'])) $p->setApplicationid($processStep['Applicationid']); 

      //Get related records, same as populaterelation 
      $currentLinks = $p->getLinksRelatedByFromstep(); 
      $links = new \Propel\Runtime\Collection\ObjectCollection(); 

      //Check for still existing links add to new collection if so. 
      //This is because creating a new Link instance and setting columns marks the object as dirty creating an exception due to duplicate keys 
      foreach ($currentLinks as $currentLink) { 
       foreach ($processStep['Links'] as $link) { 
        if (isset($link['Linkid']) && $currentLink->getLinkid() == $link['Linkid']) { 
         $links->prepend($currentLink); 

         break; 
        } 
       } 
      } 

      //Add new link objects 
      foreach ($processStep['Links'] as $link) { 
       if (!isset($link['Linkid'])) { 
        $newLink = new \Link(); 

        $newLink->setFromstep($link['Fromstep']); 
        $newLink->setTostep($link['Tostep']); 

        $links->prepend($newLink); 
       } 

      } 

      //Replace the collection and save the processstep. 
      $p->setLinksRelatedByFromstep($links); 
      $p->save(); 
1

Pour supprimer des enregistrements, vous devez absolument toujours utiliser delete. La méthode diff sur la collection est extrêmement utile pour déterminer quelles entités doivent être ajoutées, mises à jour et supprimées.

+0

Merci Ben, c'est tout ce que j'avais besoin de savoir. Dommage que j'espérais qu'il était suffisamment intuitif pour gérer les suppressions comme les inserts – Remco