如何解决如何持久保存嵌入在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 举报,一经查实,本站将立刻删除。