首页 > 解决方案 > 如何解决“传递给 a 的参数 1 必须是 Bundle\Entity\.. 的实例,Doctrine\Common\Collections\ArrayCollection 给定的实例”?

问题描述

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

实际上我有 3 个表:
-FSA_Questions
-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;
    }
}

最后,当我做一些测试时,我得到这个错误: Catchable Fatal Error: Argument 1 passed to FSABundle\Entity\FsaQuestions::addIdArea() must be an instance of FSABundle\Entity\FsaAreas, instance of 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"
            )))
        ;
    }

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

标签: phpdoctrine-ormmany-to-manysymfony-2.8

解决方案


简单的工作示例

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,
        ));
    }
}

推荐阅读