我有兩個表:步驟和鏈接加入1:n。我旨在維護通過步驟對象的鏈接。我檢索數據庫中的所有步驟並填充與鏈接表的關係。我堅持包含JSON鏈接集合的步驟對象,並使用REST將其返回到前端。PHP /推進刪除記錄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);
}
}
我基本上刪除某個步驟的每一個環節,並根據請求對象我重新鏈接。這爲我節省了比較哪些鏈接被刪除和添加的努力。插入工作就像一個魅力Propel自動創建新的鏈接。事情是它不會像插入一樣刪除。我檢查了正在被持久化的對象($ p),並且我看到鏈接被刪除,但在MySQL日誌中,Propel完全沒有執行任何操作。它看起來像鏈接集合中缺少的成員不會觸發髒標誌或類似的東西。或許我正在以這種錯誤的方式去做,我希望有人能提供一些建議。
感謝
我不;沒有看到任何調用來刪除代碼中的任何代碼。我只看到你使用clear()。 clear()清除你應用到集合的任何標準/過濾器,它實際上不會刪除任何東西。 – chocochaos
$ links var是ObjectCollection的一個實例,clear函數從集合中刪除鏈接(根據API文檔),打破了步驟和鏈接之間的關係,至少這是我的推理:)。通過打破這種關係,我希望Propel能夠爲缺失的鏈接對象觸發一個隱式刪除,就像觸發一個添加到集合中的鏈接的插入一樣。如果我要使用顯式刪除調用,我需要開始比較發佈到後端的步驟和數據庫中的鏈接,我希望能夠阻止這些鏈接。感謝您的輸入! – Remco