2017-07-13 34 views
0

我想從兩個相互關聯的表中刪除數據,但我想知道如何在phalcon中更高效地編寫數據,因爲我現在正在通過正常的PHP循環方法執行此操作。這個控制器操作如何有效地在phalcon中編寫得更多?

這裏是行動代碼:

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"); 
    } 

我想知道一個整潔,高效和簡便的方法在爾康模型等方法來做到這一點?

注意:它的工作原理你可以看到,但問題是它與我的執行速度混亂(即網頁的性能從一秒鐘加載執行操作,然後重定向回頁面更像是2秒),正如我所說的,或者從500毫秒到1000毫秒的可能性更大,而且我不想要。我想保持快速的速度並解決這個問題,而不使用循環,循環又循環遍歷與父記錄無關的記錄,從而浪費時間。 我的意思是我想要嚴格地從子表中獲取所有關聯的記錄,並直接刪除這些記錄而不影響性能(次)。

+0

這個問題可能是更適合於[代碼審查(http://codereview.stackexchange.com) –

+0

@RobbieAverill:謝謝對於你的建議,我不知道Code Review,如果我認爲我可能很快會在這裏得到答案,那會是真的嗎? –

+0

您可以這樣做,但除非您的代碼有問題,否則此問題可能會以「脫離主題」的方式關閉。 –

回答

3

你可以創建模型類中的關係。然後,您可以設置級聯操作來自動刪除相關記錄。

創建的關係,並設置級聯設置

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

更新控制器

您不再需要做的不是刪除民意調查記錄的任何其他。

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

閱讀並瞭解更多關於此這裏:

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"); 
} 

不確定爲什麼你找到這個PollsOptions一次,然後你再次找到他們刪除?這沒有意義。也更好地剛剛在數據庫設置爲級聯刪除PollsOptionsPolls被刪除,那麼你只會有:

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

這也是一個更好的方法。感謝您的回答。! –

相關問題