FormType - ManyToMany自己

时间:2016-10-04 09:58:10

标签: symfony

我尝试在实体上做父母,子女关系,但在提交表单时我遇到了问题。 (这是他自己的很多人)

要做到这一点,我的实体上有一个ManyToMany关系:

class Strain
{
  /**
   * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Strain", inversedBy="children")
   */
  private $parents;

  /**
   * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Strain", mappedBy="parents")
   */
  private $children;

  public function __construct()
  {
    $this->parents = new ArrayCollection();
    $this->children = new ArrayCollection();
  }

  public function addParent(Strain $strain)
  {
    $this->parents->add($strain);
  }

  public function removeParent(Strain $strain)
  {
    $this->parents->removeElement($strain);
  }

  public function getParents()
  {
    return $this->parents;
  }

  public function getChildren()
  {
    return $this->children;
  }

我认为没关系,我有外键,一个中间表strain_strain,有两列:strain_source和strain_target。

我的FormTypes:

class StrainType extends AbstractType
{
  /**
   * @param FormBuilderInterface $builder
   * @param array $options
   */
  public function buildForm(FormBuilderInterface $builder, array $options)
  {
   $builder->add('parents', CollectionType::class, array(
            'entry_type' => StrainParentType::class,
            'allow_add' => true,
            'allow_delete' => true,
            'by_reference' => false,
            'required' => false,
        ))
    ;

  /**
   * @param OptionsResolver $resolver
   */
  public function configureOptions(OptionsResolver $resolver)
  {
      $resolver->setDefaults(array(
          'data_class' => 'AppBundle\Entity\Strain'
      ));
  }

第二个:

class StrainParentType extends AbstractType
{
  /**
   * @param FormBuilderInterface $builder
   * @param array $options
   */
  public function buildForm(FormBuilderInterface $builder, array $options)
  {
    $builder->add('gmoStrain', EntityType::class, array(
            'class' => 'AppBundle\Entity\Strain',
            'choice_label' => 'systematicName',
            'placeholder' => '-- select a parent --',
            'query_builder' => function(EntityRepository $er) {
                return $er->createQueryBuilder('strain')
                    ->orderBy('strain.systematicName', 'ASC');
            }
        ))
    ;

  /**
   * @param OptionsResolver $resolver
   */
  public function configureOptions(OptionsResolver $resolver)
  {
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\Strain'
    ));
  }

当我发送表单时,symfony会返回此错误:

  

属性“菌株”和方法“getStrain()”,“strain()”,“isStrain()”,“hasStrain()”,“__ get()”都不存在,并且在课堂上有公共访问权限“的appbundle \实体\应变”。

如果有人有这个想法:/因为我不知道该怎么做。

编辑: 问题出在FormType中,因为我需要一个EntityType集合,我做了2个FormType,但是我可以在FormType上进行,并使用entry_options来定义EntityType的配置,如下所示:

class StrainType extends AbstractType
{
/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('parents', CollectionType::class, array(
            'entry_type' => EntityType::class,
            'entry_options' => array(
                'class' => 'AppBundle\Entity\Strain',
                'choice_label' => 'systematicName',
                'placeholder' => '-- select a parent --',
                'query_builder' => function(EntityRepository $er) {
                    return $er->createQueryBuilder('strain')
                        ->orderBy('strain.systematicName', 'ASC');
                }
            ),
            'by_reference' => false,
            'allow_add' => true,
            'allow_delete' => true,
            'required' => false,
        ))
    ;
}

/**
 * @param OptionsResolver $resolver
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\Strain'
    ));
}

0 个答案:

没有答案