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
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
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