Symfony2 - 使用其他属性保存 ManyToMany


Symfony2 - Save a ManyToMany with others attributes

我有一个表格,其中包含一个实体程序,一个实体组织和另一个程序组织,它们在第一个之间建立关系。

此实体 ProgramOrganization 与 OneToMany/ManyToOne 相关,因为它包含其他字段。

问题是表单显示正确,但是当我想将其保存在数据库中时,我收到以下消息:

"找到类型为 ...''NomBundle''Entity''Organization on Association ...''NomBundle''Entity''

Program#programOrganisations,但期望...''NomBundle''Entity''ProgramOrganization"

我使用SensioGeneratorBundle,并且doctrine:shema:valid是正确的。

另一方面,如果我删除这种关系,一切都会正确保存。

以下是我的代码摘录:(属性未翻译)

实体计划:

/**
 * @ORM'OneToMany(targetEntity="ProgrammeOrganisation", mappedBy="programme")
 */
protected $programmeOrganisations;
 
 /**
 * Constructor
 */
public function __construct()
{
    $this->programmeOrganisations = new 'Doctrine'Common'Collections'ArrayCollection();
}
 
 /**
 * Add programmeOrganisations
 *
 * @param '...'...'Entity'ProgrammeOrganisation $programmeOrganisations
 * @return Programme
 */
public function addProgrammeOrganisation('...'Entity'ProgrammeOrganisation $programmeOrganisations)
{
    $this->programmeOrganisations[] = $programmeOrganisations;
     
    return $this;
}
 
/**
 * Remove programmeOrganisations
 *
 * @param '...'...'Entity'ProgrammeOrganisation $programmeOrganisations
 */
public function removeProgrammeOrganisation('...'...'Entity'ProgrammeOrganisation $programmeOrganisations)
{
    $this->programmeOrganisations->removeElement($programmeOrganisations);
}
 
/**
 * Get programmeOrganisations
 *
 * @return 'Doctrine'Common'Collections'Collection
 */
public function getProgrammeOrganisations()
{
    return $this->programmeOrganisations;
}

实体组织 :

/**
 *
 * @ORM'OneToMany(targetEntity="ProgrammeOrganisation", mappedBy="organisation")
 */
protected $programmeOrganisations;
 
/**
 * Constructor
 */
public function __construct()
{
    $this->programmeOrganisations = new 'Doctrine'Common'Collections'ArrayCollection();
}
 
/**
 * Add programmeOrganisations
 *
 * @param '...'...'Entity'ProgrammeOrganisation $programmeOrganisations
 * @return Organisation
 */
public function addProgrammeOrganisation('...'...'Entity'ProgrammeOrganisation $programmeOrganisations)
{
    $this->programmeOrganisations[] = $programmeOrganisations;
 
    return $this;
}
 
/**
 * Remove programmeOrganisations
 *
 * @param '...'...'Entity'ProgrammeOrganisation $programmeOrganisations
 */
public function removeProgrammeOrganisation('...'...'Entity'ProgrammeOrganisation $programmeOrganisations)
{
    $this->programmeOrganisations->removeElement($programmeOrganisations);
}
 
/**
 * Get programmeOrganisations
 *
 * @return 'Doctrine'Common'Collections'Collection
 */
public function getProgrammeOrganisations()
{
    return $this->programmeOrganisations;
}

实体计划组织:

class ProgrammeOrganisation
{
    /**
     *
     * @ORM'Id
     * @ORM'ManyToOne(targetEntity="Programme", inversedBy="programmeOrganisations")
     * @ORM'JoinColumn(name="programme_id", referencedColumnName="id")
     */
    private $programme;
 
    /**
     *
     * @ORM'Id
     * @ORM'ManyToOne(targetEntity="Organisation", inversedBy="programmeOrganisations")
     * @ORM'JoinColumn(name="organisation_id", referencedColumnName="id")
     */
    private $organisation;
 
    /**
     * @var integer
     *
     * @ORM'ManyToOne(targetEntity="ContributionType")
     */
    private $contributionType;
 
    /**
     * @var 'DateTime
     *
     * @ORM'Column(name="date", type="date", nullable=true)
     */
    private $date;
 
}

程序类型

->add('programmeOrganisations' , 'entity' , array(
                      'class'    => 'NomBundle:Organisation' ,
                      'label' => 'Organisations list',
                      'property' => 'label' ,
                      'expanded' => false ,
                      'multiple' => true ,
                       
                    ))

程序控制器

public function createAction(Request $request)
    {
        $entity = new Programme();
        $form = $this->createCreateForm($entity);
        $form->handleRequest($request);
 
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($entity);
            $em->flush();
 
            return $this->redirect($this->generateUrl('programme_show', array('id' => $entity->getId())));
        }
 
        return array(
            'entity' => $entity,
            'form'   => $form->createView(),
        );
    }
 
    /**
     * Creates a form to create a Programme entity.
     *
     * @param Programme $entity The entity
     *
     * @return 'Symfony'Component'Form'Form The form
     */
    private function createCreateForm(Programme $entity)
    {
        $form = $this->createForm(new ProgrammeType(), $entity, array(
            'action' => $this->generateUrl('programme_create'),
            'method' => 'POST',
        ));
 
        $form->add('submit', 'submit', array('label' => 'Save'));
 
        return $form;
    }
 
    /**
     * Displays a form to create a new Programme entity.
     *
     * @Route("/new", name="programme_new")
     * @Method("GET")
     * @Template()
     */
    public function newAction()
    {
        $entity = new Programme();
        $form   = $this->createCreateForm($entity);
 
        return array(
            'entity' => $entity,
            'form'   => $form->createView(),
        );
    }

我认为

您的错误在这里,我没有看到您的计划和组织之间的链接,但您的表单类型说我想要一个与$ProgrammeOrganizations变量上的组织实体链接的表单,该变量被声明为计划组织实体而不是组织。

 ->add('programmeOrganisations' , 'entity' , array(
                  'class'    => 'NomBundle:ProgrammeOrganisation ' ,
                  'label' => 'Organisations list',
                  'property' => 'label' ,
                  'expanded' => false ,
                  'multiple' => true ,
                ))

应该这样做。也许还有其他我没有注意到的错误