0

我正在尝试从两个相互关联的表中删除数据,但我想知道如何在 phalcon 中更有效地编写它,因为我现在正在通过普通的 PHP 循环方法进行操作。

这是动作代码:

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

我想知道在 phalcon 模型方法等中执行此操作的简洁、高效且简单的方法?

注意:如您所见,它可以工作,但问题是它与我的执行速度相混淆,即(网页的性能从一秒钟内加载到执行操作,然后重定向回页面变得更像 2 秒)正如我所说,或者更可能是从 500 毫秒到 1000 毫秒等,而我不想要。我想保持快速并在不使用循环的情况下解决这个问题,而循环又会遍历与父记录无关的记录,这会浪费时间。我的意思是我想严格地从子表中获取所有关联的记录并直接删除它们而不影响性能(时间)。

4

2 回答 2

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

于 2017-07-14T08:50:23.207 回答
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");
}
于 2017-07-14T08:14:03.210 回答