【问题标题】:How to fix "Argument 1 passed to a must be an instance of Bundle\Entity\.., instance of Doctrine\Common\Collections\ArrayCollection given"?如何解决“传递给 a 的参数 1 必须是 Bundle\Entity\.. 的实例,Doctrine\Common\Collections\ArrayCollection 给定的实例”?
【发布时间】:2019-08-20 12:01:38
【问题描述】:

我正在尝试制作一个模块,当我创建一个新问题时将其分配给不同的区域,所以我认为它应该是多对多关系并获得另一个表“FSA_AreasQuestions”,但我不能让它开始工作吧。

其实我有 3 张桌子:
-FSA_问题
-FSA_Areas
-FSA_AreasQuestions

这就是我的做法:

FsaAreas 实体:

  class FsaAreas
{

     /**
         * @var \Doctrine\Common\Collections\Collection
         * @ORM\ManyToMany(targetEntity="FsaQuestions", inversedBy="areas")
         * @ORM\JoinTable(name="fsa_areasquestions")
         */
        private $idQuestion;

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

 /**
     * Add idQuestion
     *
     * @param \FSABundle\Entity\FsaQuestions $idQuestion
     *
     * @return FsaAreas
     */
    public function addIdQuestion(\FSABundle\Entity\FsaQuestions $idQuestion)
    {
        $this->idQuestion[] = $idQuestion;

        return $this;
    }

    /**
     * Remove idQuestion
     *
     * @param \FSABundle\Entity\FsaQuestions $idQuestion
     */
    public function removeIdQuestion(\FSABundle\Entity\FsaQuestions $idQuestion)
    {
        $this->idQuestion->removeElement($idQuestion);
    }

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

}

FsaQuestions 实体:

class FsaQuestions
{
 /**
     *  @ORM\ManyToMany(targetEntity="FsaAreas", inversedBy="idQuestion")
     */
    private $areas;

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

 /**
     * Add Areas
     * @param \FSABundle\Entity\FsaAreas $area
     * 
     * @return FsaQuestions
     */
    public function addArea(\FSABundle\Entity\FsaAreas $area){
        $this->areas[] = $area;
        return $this;
    }


    /**
     * Remove Areas
     * @param \FSABundle\Entity\FsaAreas $area
     */
    public function removeArea(\FSABundle\Entity\FsaAreas $area){
        $this->areas->removeElement($area);
    }

    /**
     * Get Areas
     * @return \Doctrine\Common\Collections\ArrayCollection;
     */
    public function getAreas(){
        return $this->areas;
    }
}

最后,当我做一些测试时,我得到了这个错误: 可捕获的致命错误:传递给 FSABundle\Entity\FsaQuestions::addIdArea() 的参数 1 必须是 FSABundle\Entity\FsaAreas 的实例,给定的 Doctrine\Common\Collections\ArrayCollection 实例


这是我的表单(FsaQuestionsType):

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
        ->add('title',TextType::class, array(
            "required"=>"required",
            "attr"=>array(
            "class"=>"form-control form-control-title"
        )))
        ->add('explanation',TextType::class, array(
            "required"=>"required",
            "attr"=>array(
            "class"=>"form-control form-control-explanation"
        )))
        ->add('question',TextType::class, array(
            "required"=>"required",
            "attr"=>array(
            "class"=>"form-control form-control-question"
        )))
        ->add('reactionplan',TextareaType::class, array(
            "required"=>"required",
            "attr"=>array(
            "class"=>"form-control form-control-reactionPLan"
        )))
        ->add('status','Symfony\Component\Form\Extension\Core\Type\CheckboxType', array(
            "label"=>"Enabled:",
            "required"=>false
            ))
        // ->add('usrcreate')
        // ->add('usrupdate')
        // ->add('datecreate')
        // ->add('dateupdate')
        ->add('idCategory',EntityType::class,array(
            "class"=>"FSABundle:FsaCategories",
            'choice_label' => 'name',
            "attr"=>array("class"=>"form-control"
            )))
        ->add('areas',EntityType::class,array(
            "class"=>"FSABundle:FsaAreas",
            'choice_label' => 'name',
            'expanded' =>false,
            'multiple' =>true,
            // 'allow_add' => true,
            // 'by_reference' => false,
            "attr"=>array("class"=>"form-control"
            )))
        ;
    }

有什么建议吗?或者有什么问题?

【问题讨论】:

    标签: php doctrine-orm many-to-many symfony-2.8


    【解决方案1】:

    简单的工作示例

    class Tag
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
    
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $name;
    
        /**
         * @ORM\ManyToMany(targetEntity="Post", mappedBy="tags")
         */
        private $posts;
    
        public function __construct()
        {
            $this->posts = new ArrayCollection();
        }
    
        public function getId(): ?int
        {
            return $this->id;
        }
    
        public function getName(): ?string
        {
            return $this->name;
        }
    
        public function setName(string $name): self
        {
            $this->name = $name;
    
            return $this;
        }
    
        public function getPosts()
        {
            return $this->posts;
        }
    }
    
    class Post
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
    
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $name;
    
        /**
         * @ORM\ManyToMany(targetEntity="Tag", inversedBy="posts")
         * @ORM\JoinTable(name="tags_posts")
         */
        private $tags;
    
        public function __construct()
        {
            $this->tags = new ArrayCollection();
        }
    
        public function getId(): ?int
        {
            return $this->id;
        }
    
        public function getName(): ?string
        {
            return $this->name;
        }
    
        public function setName(string $name): self
        {
            $this->name = $name;
    
            return $this;
        }
    
        public function getTags()
        {
            return $this->tags;
        }
    
        public function addTag(Tag $tag): self
        {
            if (!$this->tags->contains($tag)) {
                $this->tags->add($tag);
            }
    
            return $this;
        }
    }
    
    class PostType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('name', TextType::class)
                ->add('tags', EntityType::class, [
                    'class' => Tag::class,
                    'choice_label' => 'name',
                    'multiple' => true,
                    'expanded' =>false,
                ])
                ->setMethod('POST')
                ->add('save', SubmitType::class)
            ;
        }
    
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => Post::class,
            ));
        }
    }
    

    【讨论】:

    • 抱歉,我收到错误“选项 allow_add 不存在”
    • 当然,我已经编辑了我的问题,添加了表单类型,谢谢。
    • 将 EntityType 更改为 CollectionType
    • 但如果我将其更改为集合类型,它不会在选择中显示区域
    • 你添加entry_type选项了吗?
    猜你喜欢
    • 2019-07-13
    • 2021-04-22
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多