【发布时间】:2023-03-12 22:08:01
【问题描述】:
我有需要处理 500 多个实体实例的表单集合。在我将超时时间增加到 60 秒并增加 max_input_vars 表单工作后,但令人讨厌的是它有多慢。渲染表单很慢,但提交这么大的表单很麻烦。
我正在考虑创建纯 HTML 表单,但还有一些其他缺点作为验证很糟糕。 那么,有没有什么合适的方法可以通过 symfony 表单来处理这么多数据呢?
控制器:
public function ratesCardAction() {
$bannerList = $this->data;
$em = $this->getDoctrine()->getManager();
$form = $this->createForm(new AdvertiserRatesType($bannerList));
if ('POST' == $this->getRequest()->getMethod()) {
$form->handleRequest($this->getRequest());
$advertiserCampaign = $form->getData();
if ($form->isValid()) {
foreach ($advertiserCampaign['campaignsAdZones'] as $campaignAdZone) {
$em->persist($campaignAdZone);
}
$em->flush();
}
}
return array(
'form' => $form->createView()
);
}
class AdvertiserRatesType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder ->add('campaignsAdZones', 'collection', array(
'type' => new AdvertiserRatePerCountryType(),
'data' => $this->rates,
'empty_data' => null,
'options' => array(
'attr' => array('class' => 'campaignAdZoneItem')
)
))
;
}
}
...
嵌入表单如下:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('class', 'entity', array(
'class' => 'AcmeCmsBundle:PublisherTypes',
'property' => 'class',
'read_only' => true,
'disabled' => true
)
)
->add('country', 'entity', array(
'class' => 'AcmeCmsBundle:Countries',
'property' => 'name',
)
)
->add('text1')
->add('text2')
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\CmsBundle\Entity\Rates'
));
}
【问题讨论】:
-
您在哪个特定的地方拥有 500 多个实体(500 个国家/地区,500 种类型,或收藏 500 项)?对数据库的调用有多少?
-
我有 500 件收藏品。所以,我的 POST 请求数据有 500 个 Acme\CmsBundle\Entity\Rates 对象实例: array(0=>Acme\CmsBundle\Entity\Rates, 1=>Acme\CmsBundle\Entity\Rates, .... 500=> Acme\CmsBundle\Entity\Rates)
-
您应该尝试使用分页之类的方式将表单拆分成小块。
-
您是否尝试过使用分析器来确定原因?你看过 Doctrine 生成的 sql 语句吗?因此,真的不值得放弃 Symfony Form / Doctrine。想到的一个原因是您的代码尝试更新每条记录,无论它是否被用户修改。另外,如果可能的话,对数组而不是对象使用水合,只获取所需的列而不是全部。
-
嗨@TadasSasnauskas,我也有类似的问题。您能否详细说明如何仅获取所需的列而不是全部?
标签: php forms symfony bulkinsert bulk