在 phalcon 中可以多高效地编写此控制器操作?
How efficiently this controller action can be written more in phalcon?
我正在尝试从两个相互关联的 table 中删除数据,但我想知道如何在 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 毫秒等等,我不想要。我想保持快速并在不使用循环的情况下解决这个问题,循环又循环遍历与父记录无关的记录,这太浪费时间了。
我的意思是我想严格地从子 table 获取所有关联记录并直接删除这些记录而不影响性能(时间)。
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
一次然后又找到它们并删除?这没有意义。也最好在数据库中设置级联删除 PollsOptions
当 Polls
被删除时你将只有:
public function deletepollAction($pollId)
{
$data = Polls::findFirst($pollId);
$data->delete();
$this->response->redirect("/poll");
}
您可以在模型中创建关系 class。然后您可以设置级联操作以自动删除相关记录。
正在创建关系并设置级联设置
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
我正在尝试从两个相互关联的 table 中删除数据,但我想知道如何在 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 毫秒等等,我不想要。我想保持快速并在不使用循环的情况下解决这个问题,循环又循环遍历与父记录无关的记录,这太浪费时间了。 我的意思是我想严格地从子 table 获取所有关联记录并直接删除这些记录而不影响性能(时间)。
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
一次然后又找到它们并删除?这没有意义。也最好在数据库中设置级联删除 PollsOptions
当 Polls
被删除时你将只有:
public function deletepollAction($pollId)
{
$data = Polls::findFirst($pollId);
$data->delete();
$this->response->redirect("/poll");
}
您可以在模型中创建关系 class。然后您可以设置级联操作以自动删除相关记录。
正在创建关系并设置级联设置
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