php - 如何解决“传递给 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"
)))
;
}
有什么建议吗?或者有什么问题?
解决方案
简单的工作示例
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,
));
}
}
推荐阅读
- php - 如何从输入值中拆分单词?
- apl - 从以秒为单位的 unix 时间到 ISO-8601 中的日期时间
- linux - Vim is not installing on fedora
- c++ - 在什么情况下我想在 C/C++ 代码中使用内联汇编代码
- reactjs - React Bootstrap - 进度条的宽度太小
- jquery - 如何在nodejs中更改日期格式
- react-native - Is App considered to be a component in React Native?
- haskell - Haskell 代码找出数字的组合
- graphql - 在输入可以采用不同类型的地方制作 Graphql 输入
- intellij-idea - ScalaTestWithActorTestKit 未找到