在删除表单元素的表单更新时将实体关系设置为空

Entity relationship being set to null on update of form with removed form element

我有一个页面记录一个调查实体,它与一个问题实体是一对多的关系,即每个调查可以有很多问题。问题由问答组成 属性.

我的目标是拥有一个只显示问题元素的表单,前提是问题元素还没有提交并保留答案...

我要的表格是嵌套的调查表格包含1..n个问题表格。

假设页面上有两个问题表单元素,姓名和年龄。如果我提交姓名并将年龄留空,姓名将保留,年龄将保持空白。然后我回去提交年龄。年龄被持久化,姓名仍在数据库中,但外键 survey_id 在问题 table 上设置为 null,关系丢失。

为了隐藏答案,如果模型包含给定元素的数据,我将使用 PRE_SET_DATA 事件上的表单事件删除它们。

有人对这里要找的东西有什么建议吗?

我已将提交方法从处理请求更改为 $form->submit(将 clearMissing 标志设置为 false),但 survey_id 仍设置为 null。提交是由调查控制器完成的,我是否还必须明确告诉问题子表单不要 'clearMissing'?

*编辑:我正在考虑的解决方案是在 PRE_SUBMIT 表单事件中添加 'deleted' 表单元素和数据,我认为这将确保 Doctrine 不会假设丢失数据需要删除。我不确定这是否合理,是否有更好的方法?

控制器:

    /**
     * @Route("/client/{surveyIdentifier}/{clientIdentifier}", name="client_survey_form", methods={"GET","POST"})
     */
    public function clientSurveyForm(Request $request, $surveyIdentifier, $clientIdentifier,
                                     QuestionRepository $questionRepository): Response
    {

        $survey = $this->getDoctrine()->getRepository(Survey::class)
            ->findOneBy(['surveyIdentifier' => $surveyIdentifier]);


        $form = $this->createForm(ClientSurveyType::class, $survey, [
        ]);

        $form->submit($request->get($form->getName()), false);

        if ($form->isSubmitted() && $form->isValid()) {


            $this->getDoctrine()->getManager()->flush();

            return $this->redirectToRoute('client_confirmation',
                [
                    'surveyIdentifier' => $surveyIdentifier,
                    'clientIdentifier' => $clientIdentifier
                ]
            );
        }
    }

Survey Entity:

/**
 * @ORM\Entity(repositoryClass="App\Repository\SurveyRepository")
 */
class Survey
{
    /**
    * @ORM\Id()
    * @ORM\GeneratedValue()
    * @ORM\Column(type="integer")
    */
    private $id;

    /**
    * @ORM\Column(type="string", length=255, nullable=true)
    */
    private $name;

    /**
    * @ORM\OneToMany(targetEntity="App\Entity\Question", mappedBy="survey", cascade={"persist"})
    */
    private $questions;

    /**
    * @ORM\ManyToOne(targetEntity="App\Entity\Staff", inversedBy="surveys", cascade="persist")
    */
    private $staff;

    /**
    * @ORM\ManyToOne(targetEntity="App\Entity\Client", inversedBy="surveys")
    */
    private $client;

    /**
    * @ORM\ManyToOne(targetEntity="App\Entity\Job", inversedBy="surveys")
    */
    private $job;

    /**
    * @ORM\Column(type="string", length=255, nullable=true)
    */
    private $type;

    /**
    * @ORM\Column(type="string", length=128, nullable=true)
    */
    private $surveyIdentifier;

    /**
    * @ORM\Column(type="string", length=255, nullable=true)
    */
    private $clientSurveyUrl;

    /**
    * @ORM\Column(type="text", nullable=true)
    */
    private $clientComments;

    /**
    * @ORM\Column(type="string", length=255, nullable=true)
    */
    private $clientImpedimentForSurvey;





    Question Entity:




    /**
    * @ORM\Entity(repositoryClass="App\Repository\QuestionRepository")
    */
    class Question
    {
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $question;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $answer;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $answerType;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $answerChoices;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Survey", inversedBy="questions")
     */
    private $survey;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $completionDate;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\QuestionTransactionLog", mappedBy="question")
     */
    private $questionTransactionLogs;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $attachmentFilename;

如前所述,您可以采用快速而粗略的方式从数据库中检索调查并根据用户提交的内容手动更新答案,而不是尝试使 "automagic" 起作用。 我希望这有帮助。如果我发现更有用的东西,我会更新我的答案