Symfony - 为什么我的表单会得到表中存在的每个答案?

时间:2016-10-25 10:32:28

标签: php symfony doctrine-orm twig

这不是一个问题,而是我注意到并希望更好地理解的东西。

我有一个Poll类,其中包含votespollOptions的集合。 我的PollOption班级拥有poll所属的titleVotepoll类还包含其所属的voteChoices,以及自己的userVoteChoice集合。 vote类包含其所属的answer,投票所需的PollOptionpriority)以及Vote

我有一个包含表单集合的表单(VoteChoice有很多VoteChoiceType

class VoteChoiceType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('answer', null, array('disabled' => true)) ->add('priority', null); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'data_class' => 'PollBundle\Entity\VoteChoice', )); } } 如下

VoteController

现在在Vote我创建并填充了voteChoicesanswer,根据当前投票的可用选项(从网址派生)设置$vote = new Vote(); $vote->setPoll($poll); foreach ($vote->getPoll()->getPollOptions() as $op) { $vc = New VoteChoice(); $vote->addVoteChoice($vc->setAnswer($op)); }

<ul class="voteChoices" data-prototype="{{form_widget(form.voteChoices.vars.prototype)|e('html_attr')  }}">
    {% for voteChoice in form.voteChoices %}
            <li>{{ voteChoice.vars.value.answer }} {{ form_row(voteChoice.priority) }}</li>
    {% endfor %}
</ul>
</div>
<p><button type="submit" class="btn btn-success">Go!</button></p>
{{ form_end(form) }}

所以我的枝条如下

answer

但是,如果我在VotechoiceType中启用{{ form_row(voteChoice.answer) }},并且在我的游戏中添加VoteChoice,我会在表格中注意到所有我的投票选项可选列表,即使它们是另一个民意调查的一部分。

这是为什么?如何才能显示投票所属的民意调查中可用的选项?我的怀疑是我没有正确处理PollOptionPoll之间的关系(多对一)。如果我在这里犯了错误,我可能已经在其他地方做过了(例如Vote可能会获得数据库中的每个// Construct a new array of the stripped numbers $flattenedArray = array_map(function($item) { list(, $number) = explode(' ', $item['b_title']); return $number; }, $yourArray); // Concatenate the numbers into a string joined by , $out = implode(', ', $flattenedArray); 而不是属于它的那些{/ p>}

1 个答案:

答案 0 :(得分:2)

$builder->add('answer', null, array('disabled' => true))

PollOption创建一个ChoiceType-Field,默认情况下会使用所有PollOption填充它。没有任何限制选择字段,因为您的表单不知道通过$voteChoice->getVote()->getPolloptions()给出的期望限制。

看看Symfonys EntityType Fieldquery_builder选项可以为您提供一种方法来解决您的问题,方法是在答案字段中添加自定义查询,该字段选择通过以下方式更正PollOptions的子集VoteChoice -> Vote -> Polloptions关系。