0

我的多对多关系之一有问题。我已经调试了我的表单,我看到在表单验证后,所选对象实际上在实体对象中,但它从未保存到数据库中,所以我的映射代码一定有问题,但我从一个工作中复制粘贴一个只是替换了字段和路径...

这是公司对象的相关代码

/**
 * @ORM\ManyToMany(targetEntity="BizTV\ContentManagementBundle\Entity\Template", inversedBy="companies")
 * @ORM\JoinTable(name="templatePermissions")
 */
private $templatePermissions;

/**
 * Add templatePermissions
 *
 * @param BizTV\ContentManagementBundle\Entity\Template $templatePermissions
 */
public function addTemplate(\BizTV\ContentManagementBundle\Entity\Template $templatePermissions)
{
    $this->templatePermissions[] = $templatePermissions;
}

和模板对象

/**
 * @ORM\ManyToMany(targetEntity="BizTV\BackendBundle\Entity\company", mappedBy="templatePermissions")
 */
private $companies;
/**
 * Add companies
 *
 * @param BizTV\BackendBundle\Entity\company $companies
 */
public function addCompany(\BizTV\BackendBundle\Entity\company $companies)
{
    $this->companies[] = $companies;
}

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

更新的代码(和创建类似,并且有同样的问题)只是一个标准......

public function updateAction($id)
{
    $em = $this->getDoctrine()->getEntityManager();

    $entity = $em->getRepository('BizTVContentManagementBundle:Template')->find($id);

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Template entity.');
    }

    $editForm   = $this->createForm(new TemplateType(), $entity);
    $deleteForm = $this->createDeleteForm($id);

    $request = $this->getRequest();

    $editForm->bindRequest($request);

    if ($editForm->isValid()) {


        //DEBUG
        // foreach($entity->getCompanies() as $c) {
            // echo $c->getCompanyName();   
        // }
        // die;

        $em->persist($entity);
        $em->flush();

        $this->getRequest()->getSession()->setFlash('success', 'Template '.$entity->getId().' har uppdaterats.' );

        return $this->redirect($this->generateUrl('listTemplates'));
    }

这是我的表格,就像我说的那样,它非常适合将东西放入我的对象(模板实体)中,但它不会被持久化到数据库中......

    $builder
    ->add('companies', 'entity', array(
            'label' => 'Företag som har tillgång till mallen',
            'multiple' => true,   // Multiple selection allowed
            'expanded' => true,   // Render as checkboxes
            'property' => 'company_name',
            'class'    => 'BizTV\BackendBundle\Entity\company',
        ))
        ;   

我错过了什么?

4

1 回答 1

3
  1. 注意选择拥有/反向。拥有方应该是负责持久操作的一方。在您的情况下,拥有方应该是模板实体而不是公司。

    更多信息请看这里:

    http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/association-mapping.html#picking-owning-and-inverse-side

  2. 您的公司实体类名称是否以小写字母开头?如果没有,你有一个错字:

    BizTV\BackendBundle\Entity\company

  3. 尝试在持久性上添加级联

最后,您在公司实体中的关系定义应如下所示:

/**
 * @ORM\ManyToMany(targetEntity="BizTV\BackendBundle\Entity\company", inversedBy="templatePermissions", cascade={"persist"})
 */
private $companies;
于 2012-09-17T09:23:50.120 回答