【问题标题】:Persistence with embedded forms嵌入表单的持久性
【发布时间】:2013-01-10 08:50:15
【问题描述】:

我正在尝试使用this 指南设置一些嵌入式表单。 我在我的应用程序中设置了两个模型,课程和评估。

每节课可以有多个评估。

我设置了一个表单,用户可以在其中创建课程以及该课程中所需的任意数量的评估。提交表单后,它会成功创建课程记录和所有评估记录,但是创建的评估记录未链接到父课程(课程 ID 字段留空)。

谁能帮忙?

任何建议表示赞赏。

谢谢。

我的模型类是这样设置的:

评价:

class Evaluation
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Lesson", inversedBy="evaluations")
     * @ORM\JoinColumn(name="lesson_id", referencedColumnName="id")
     */
    protected $lesson;

/**
     * Set lesson
     *
     * @param \LessonBundle\Entity\Lesson $lesson
     * @return Evaluation
     */
    public function setLesson(\LessonBundle\Entity\Lesson $lesson = null)
    {
        $this->lesson = $lesson;

        return $this;
    }

    /**
     * Get lesson
     *
     * @return \LessonBundle\Entity\Lesson 
     */
    public function getLesson()
    {
        return $this->lesson;
    }
}

教训:

class Lesson
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="Evaluation", mappedBy="lesson", cascade={"persist"})
     */
    protected $evaluations;

    public function __construct()
    {
        $this->evaluations = new ArrayCollection();
    }


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Add evaluations
     *
     * @param \DS\LessonBundle\Entity\Evaluation $evaluations
     * @return Lesson
     */
    public function addEvaluation(\LessonBundle\Entity\Evaluation $evaluations)
    {
        $this->evaluations[] = $evaluations;

        return $this;
    }

    /**
     * Remove evaluations
     *
     * @param \DS\LessonBundle\Entity\Evaluation $evaluations
     */
    public function removeEvaluation(\LessonBundle\Entity\Evaluation $evaluations)
    {
        $this->evaluations->removeElement($evaluations);
    }

    /**
     * Get evaluations
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getEvaluations()
    {
        return $this->evaluations;
    }

    public function setEvaluations(ArrayCollection $evaluations)
    {
        foreach ($evaluations as $evaluation) {
            $evaluation->setLesson($this);
        }

        $this->evaluations = $evaluations;
    }
}

我的控制器方法:

public function newAction()
{
$lesson = new Lesson;

$evaluation1 = new Evaluation();
$lesson->getEvaluations()->add($evaluation1);
$form    = $this->createForm(new LessonType(), $lesson);
$request = $this->getRequest();

if ($request->getMethod() == 'POST') {
    $form->bindRequest($request);

    if ($form->isValid()) {

        $em = $this->getDoctrine()->getEntityManager();
        $em->persist($lesson);
        $em->flush();

        return $this->redirect($this->generateUrl('lesson_list'));
    }
}

return $this->render('LessonBundle:Lesson:new.html.twig', array('form' => $form->createView()));

}

还有我的表格:

class LessonType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('evaluations', 'collection', array(
                                            'type' => new EvaluationType(),
                                            'allow_add' => true,
                                            'by_reference' => false,
                                            ));
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'LessonBundle\Entity\Lesson',
        );
    }

    public function getName()
    {
        return 'Lesson';
    }
}

还有:

class EvaluationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('report');
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'LessonBundle\Entity\Evaluation',
        );
    }

    public function getName()
    {
        return 'Evaluation';
    }
}

最后,我的表单树枝模板:

{% extends '::base.html.twig' %}

{% block content %}
<form class="vertical" action="" method="post" {{ form_enctype(form) }}>
    {{ form_errors(form) }}

    <ul class="collectionholder" data-prototype="{{ form_widget(form.evaluations.vars.prototype)|e }}">
    {% for evaluation in form.evaluations %}

        <li>{{ form_row(evaluation) }}</li>

    {% endfor %}
    </ul>
    {{ form_rest(form) }}
    <input type="submit" />
</form>
{% endblock %}

【问题讨论】:

    标签: forms symfony doctrine-orm object-persistence


    【解决方案1】:

    在你的班级课程实体中添加:

    /**
     * Add evaluations
     *
     * @param \DS\LessonBundle\Entity\Evaluation $evaluations
     * @return Lesson
     */
    public function addEvaluation(\LessonBundle\Entity\Evaluation $evaluations)
    {
        $this->evaluations[] = $evaluations;
    
        $evaluations->setLesson($this);
    
    
        return $this;
    }
    

    【讨论】:

    • 这是最重要的:$evaluations->setLesson($this);当addEvaluation
    猜你喜欢
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多