微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何持久保存嵌入在Forms集合中的表单集合? $form->isValid()返回什么?那么,您应该将persist()放在哪里?您还应该保留Campaign对象吗?

如何解决如何持久保存嵌入在Forms集合中的表单集合? $form->isValid()返回什么?那么,您应该将persist()放在哪里?您还应该保留Campaign对象吗?

对于我的投票应用程序,我创建了一个名为CampaignType的FormType,该FormType包含一个名为blocks的CollectionType,而该CollectionType则包含一个名为lines的CollectionType,它包含一个名为field的CollectionType,而该CollectionType则名为pollResults。

在我的下一个代码示例中,您可以看到我的代码,该代码呈现“视图”以填充广告系列(投票)。

public function fillAction(Request $request,$id)
{
    $campaign = $this->getDoctrine()->getRepository(Campaign::class)->find($id);
    $entityManager = $this->getDoctrine()->getManager();

    foreach ($campaign->getBlocks() AS $block){
        foreach ($block->getLines() AS $line){
            foreach ($line->getFields() AS $field){

                $pollResult = new PollResult();
                $pollResult->setCampaign($campaign);
                $pollResult->setField($field);
                $pollResult->setUser($this->getUser());

                $entityManager->persist($pollResult);

                $field->getPollResults()->add($pollResult);
            }
        }
    }

    $form = $this->createForm(CampaignType::class,$campaign);
    $form->handleRequest($request);

    if($form->isSubmitted() && $form->isValid()){
        var_dump("true");
        //$entityManager->persist($campaign);
        $entityManager->flush();
        return $this->redirectToRoute("grappt_poll_campaignShow",['id' => $id]);
    }

    return $this->render('GrapptPollBundle:Campaigns:fill.html.twig',[
        'campaign' => $campaign,'form' => $form->createView()
    ]);
}

唯一必须保留在数据库中的是PollResults。 每个PollResult都有一个条目campaign_id和它所属的field_id,填写广告活动的user_id用户选择的value(当然是它自己的) id,它会自动生成。)

我的问题是我不知道该怎么做。 我必须在哪里打电话给$entityManager->persist($pollResult);。 现在,我将其直接放在初始化材料下面。 我是否必须将其放入if($form->isSubmitted() && $form->isValid())查询并遍历每个pollResult? 尽管那里没有任何变化,我是否必须致电$entityManager->persist($campaign);? 此外,我想知道是否需要为每个PollResult的值输入添加一些内容

预先感谢每个答案

lxg

解决方法

$form->isValid()返回什么?

这取决于您对主表单的验证约束。如果验证约束位于实体的注释中,则在主实体中,您应具有@Assert\Valid()注释,以确保嵌套表单有效:

class Campaign
{
    /**
     * @ORM\OneToMany(…)
     * @Assert\Valid() // <- this line here
     */
    private $blocks;
    ...

如果您希望将验证约束条件放入CampaignType中,则可以将其放在选项中:

public function buildForm (FormBuilderInterface $builder,array $options)
{
    $builder
        ->add('blocks',CollectionType::class,[
            'entry_type' => BlockType::class,'constraints' => array(new Valid()) // <- this line here
            ...

那么,您应该将persist()放在哪里?

最好是在任何持久性之前进行Symfony的表单验证(->isValid()),以确保安全性和数据完整性(例如,在确保csrf保护之前不要持久化)。如果您可以添加大量数据(例如在提交一份表单后保留数千个实体),则可以研究Doctrine的批处理和批量插入:https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/batch-processing.html

您还应该保留Campaign对象吗?

这取决于您实体中的级联持久性规则。 您可以在这里找到所有规则以微调级联:https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/working-with-associations.html#transitive-persistence-cascade-operations

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。