如何避免“必须管理传递到选择字段的实体。可能会将它们保留在实体管理器中?”

时间:2016-02-17 07:55:37

标签: php doctrine-orm symfony

    来自现有数据库的
  1. documentation
  2. Generated Entities控制器
  3. 但它不适用于异常消息:

      

    必须管理传递到选择字段的实体。也许坚持他们在实体经理?

    实体

    /**
     * Question
     *
     * @ORM\Table(name="question", indexes={@ORM\Index(name="question_category_id", columns={"question_category_id"})})
     * @ORM\Entity
     */
    class Question
    {
        //...
    
        /**
         * @var \AppBundle\Entity\QuestionCategory
         * @ORM\ManyToOne(targetEntity="AppBundle\Entity\QuestionCategory")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="question_category_id", referencedColumnName="id")
         * })
         */
        private $questionCategory;
    
        public function __construct() 
        {
            $this->questionCategory = new QuestionCategory();
        }
    
        //...
    }
    

    表格

    class QuestionType extends AbstractType
    {
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('name')
                ->add('questionCategory');
        }
    
        /**
         * @param OptionsResolver $resolver
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'AppBundle\Entity\Question'
            ));
        }
    }
    

    控制器

    class QuestionController extends Controller
    {
       //...
    
       /**
         * Creates a new Question entity.
         * @Route("/new", name="question_new")
         * @Method({"GET", "POST"})
         */
        public function newAction(Request $request)
        {
            $question = new Question();
            $form = $this->createForm('AppBundle\Form\QuestionType', $question);
            $form->handleRequest($request);
    
            if ($form->isSubmitted() && $form->isValid()) {
                $em = $this->getDoctrine()->getManager();
                $em->persist($question);
                $em->flush();
    
                return $this->redirectToRoute('question_show', array('id' => $question->getId()));
            }
    
            return $this->render('question/new.html.twig', array(
                'question' => $question,
                'form' => $form->createView(),
            ));
        }
    
    //...
    }
    

    深度调试对我没有任何帮助。如何解决?

    测试存储库以重现错误:Generated CRUD

5 个答案:

答案 0 :(得分:5)

根据GitHub项目中显示的代码,Question实体具有以下构造函数:

public function __construct() 
{
    $this->questionCategory = new QuestionCategory();
}

创建entity表单字段时,它只能包含由学说管理的值,但不会管理您的新questionCategory

通常,最好的解决方案是在构造函数中不填充此实体字段,但仅限于您严格需要它的那些地方。在构建表单时,Synfony会在提交并致电$form->handleRequest()后为您填写。

因此,在您的情况下,只需删除Question实体的构造函数。

之后,您还需要在__toString()实体中实施QuestionCategory方法:

 public function __toString(){
       return 'whatever you neet to see the type`;
 }

答案 1 :(得分:2)

此错误表示属性questionCategory是一种关系,不受 EntityManager 管理。要自动完成此操作,请在您的Doctrine Mapping中为questionCategory属性添加 cascade-persist

实体

/**
 * Question
 *
 * @ORM\Table(name="question")
 * @ORM\Entity
 */
class Question
{
    //...

    /**
     * @ORM\ManyToOne(
     *       targetEntity="QualityBundle\Entity\QuestionCategory", 
     *       cascade={"persist"}
     * )
     */
    private $questionCategory;

    //...
}

这样,当您致电$em->persist($question);时,与QuestionCategory关联的Question也会自动保留。

答案 2 :(得分:1)

当心,如果在表单类型中使用FORMAT()而不是FORMAT('%s.%s', tbl.table_name, col.column_name) 的关系时也可能引发此错误。
不幸的复制/粘贴使我处于这种情况。

答案 3 :(得分:1)

在我的情况下,我遇到了这个问题,因为我使用EntityType而不是ChoiceType来构建selectList。

EntityType仅显示数据库中的数据,而ChoiceType可以显示“非托管”对象。

我希望这会有所帮助。

答案 4 :(得分:0)

在我的情况下,这只是因为我的错,我使用QueryManager而不是EntityManager在我的控制器中找到实体。