1

こんにちは、複数の埋め込みフォーム (1 対多) に問題があります。1 つのゲームには多くの賞品があり、1 つの賞品には多くの選択肢があります。このフォームを保存しようとすると、エラー メッセージが表示されます

SQLSTATE [23000]: 整合性制約違反: 1048 列 'fk_prize' を null にすることはできません

カスケードのエンティティに既に設定しており、フォーム タイプで by_refference false を設定しましたが、機能しませんでした。割り当てられた他のすべての外部キーは完全に機能します。

更新: コントローラーでこのフォームを実行すると、正常に保存されました。しかし、私は教義でこれをやりたいです。それはドクトリンのバグですか、それとも私のコードに何か問題がありますか? 御時間ありがとうございます!

            //Hacked code in controller to save the form
            $prizes = $data->getPrizes();
            foreach ($prizes as $prize) {
                $prizeOptions = $prize->getPrizesOptions();
                foreach ($prizeOptions as $prizeOption) {
                    $prizeOption->setPrize($prize);
                }
            }
            $em->persist($data);
            $em->flush();





<?php 
    class Game
    {
        /**
         * @ORM\OneToMany(targetEntity="Prize", mappedBy="game", cascade={"persist"})
         */
        protected $prizes;

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


    }
    ?>      

<?php           

        class GameType extends AbstractType
        {

            /**
             * @param FormBuilderInterface $builder
             * @param array $options
             */
            public function buildForm(FormBuilderInterface $builder, array $options)
            {


                $builder
                    ->add('alias', 'text' , [
                        'label'=>'Name'
                    ])               
                    ->add('prizes' ,'collection', array(
                        'type'         => new PrizeType($this->intention),
                        'allow_add'    => true,
                        'allow_delete' => false,
                        'prototype' => true,
                        'by_reference' => false,
                        'label' => false,
                    ))                
                    ->add('save', 'submit', [
                        'attr'   =>  [
                            'class'   => 'btn btn-primary'
                        ]
                    ]);
            }                
        }

    <?php

    class Prize 
    {

    /**
     * The Game
     * @ORM\ManyToOne(targetEntity="Game")
     * @ORM\JoinColumn(name="game_id", referencedColumnName="id")
     */
    protected $game;

    /**
     * @ORM\OneToMany(targetEntity="PrizeOptions", mappedBy="prize", cascade={"persist"})
     */
    protected $prizes_options;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->prizes_options = new \Doctrine\Common\Collections\ArrayCollection();
    }
    }

    class PrizeType extends AbstractType
    {

        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {

            $builder            
                ->add('prizes_options' ,'collection', array(
                    'type' => new PrizeOptionsType(),
                    'allow_add'    => true,
                    'allow_delete' => true,
                    'by_reference' => false,
                    'label' => false,
                ))    
            ;
        }


    }

    <?php

    class PrizeOptionsType extends AbstractType
    {

        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('name', 'text' , [
                    'label'=>'Value'
                ])
                ;
        }

    }
4

1 に答える 1