Symfony2 2.3.7 -Doctrine 2.4.1:ManyToMany 关系未保存到数据库

Posted

技术标签:

【中文标题】Symfony2 2.3.7 -Doctrine 2.4.1:ManyToMany 关系未保存到数据库【英文标题】:Symfony2 2.3.7 -Doctrine 2.4.1: ManyToMany relation is not saved to database 【发布时间】:2013-11-27 10:01:00 【问题描述】:

实体类是 GeLdapGrupo 和 GeMedio。它们之间创建了多对多关系。

尝试使用 ", cascade="persist"" 和不使用。我已经修改了与多对多关系相关的添加和删除元素方法。 Fixtures 将数据放在 ge_medio 和 ge_ldap_grupo 表中,但不在 ge_ldap_grupo 表(即多对多关系表)中。

头等舱:

/**
 * GeMedio
 *
 * @ORM\Table(name="ge_medio")
 * @ORM\Entity
 */
class GeMedio


    //...

    /**
     * @ORM\ManyToMany(targetEntity="GeLdapGrupo", mappedBy="geMedios"
        , cascade="persist")
     */
    private $geLdapGrupos;

    //...

    /**
     * Add GeMedios
     *
     * @param GeMedio $geMedios
     * @return GeLdapGrupo
     */
    public function addGeMedio(GeMedio $geMedios, $cascade = true)
    
        $this->GeMedios[] = $geMedios;
        if ($cascade) 
            $geMedios->addGeLdapGrupo($this, false);
        
        return $this;
    

    /**
     * Remove GeMedios
     *
     * @param GeMedio $geMedios
     */
    public function removeGeMedio(GeMedio $geMedios, $cascade = true)
    
        $this->GeMedios->removeElement($geMedios);
        if ($cascade) 
            $geMedios->removeGeLdapGrupo($this, false);
        
    

二等:

/**
 * GeLdapGrupo
 *
 * @ORM\Table(name="ge_ldap_grupo")
 * @ORM\Entity
 */
class GeLdapGrupo


    //...

    /**
     * @ORM\ManyToMany(targetEntity="GeMedio", inversedBy="geLdapGrupos"
        , cascade="persist")
     * @ORM\JoinTable(name="ge_ldap_medio",
     *      joinColumns=@ORM\JoinColumn(name="id_grupo_ldap",
                referencedColumnName="id_grupo_ldap"),
     *      inverseJoinColumns=@ORM\JoinColumn(name="id_medio",
                referencedColumnName="id_medio")
     *      )
     */
    private $geMedios;

    //...

    /**
     * Add GeMedios
     *
     * @param GeMedio $geMedios
     * @return GeLdapGrupo
     */
    public function addGeMedio(GeMedio $geMedios, $cascade = true)
    
        $this->GeMedios[] = $geMedios;
        if ($cascade) 
            $geMedios->addGeLdapGrupo($this, false);
        
        return $this;
    

    /**
     * Remove GeMedios
     *
     * @param GeMedio $geMedios
     */
    public function removeGeMedio(GeMedio $geMedios, $cascade = true)
    
        $this->GeMedios->removeElement($geMedios);
        if ($cascade) 
            $geMedios->removeGeLdapGrupo($this, false);
        
    

    //...


更新代码是这样的:

//insert some data in table 1, save element on an array gemedios.
//  Doing $manager->persist($entity);

//insert some data in table 2, save element on an array geldapgrupos.
//  Doing $manager->persist($entity);

foreach ($relations as $relation)
    print_r($relation);
    $gemedio = $gemedios[$relation['id_gemedio']];
    $geldapgrupo = $geldapgrupos[$relation['id_geldapgrupo']];

    //Now we have all the related entities...
    $gemedio->addGeLdapGrupo($grupo);
    //$geldapgrupo->addGeMedio($medio);
    print_r($medio);
    print_r($grupo);
    //$manager->persist($medio);
    //$manager->persist($grupo);

$manager->flush();

我使用 print_r 检查了 fixtures 命令的输出中的数据,它看起来很好(gegrupo 有一个相关的 geldapgrupo,而 geldapgrupo 有相同的 gegrupo)。

问题是,如前所述,表 ge_ldap_grupo 上没有数据。

谁能帮帮我?

非常感谢。

【问题讨论】:

你仍然需要坚持下去 谢谢。同时,我已经将多对多转换为一对多多对一关系,并带有一个“桥梁”实体。以后,如果我有足够的时间、精力和更多的信息,我会尝试再尝试一下那些现在明显有问题的多对多关系功能。 【参考方案1】:

不需要坚持任何一种方式,添加多对多关系只能在一个方向上完成,这取决于您如何定义关系:添加只能由父实体(所有者实体)完成关系,所以在你的情况下你必须使用:

$geldapgrupo->addGeMedio($gmedio);

Symfony 不会为此引发错误。

http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html#owning-and-inverse-side-on-a-manytomany-association

【讨论】:

以上是关于Symfony2 2.3.7 -Doctrine 2.4.1:ManyToMany 关系未保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

找不到 Symfony2 组件类

Symfony2 - 访问被拒绝

Symfony2 / SonataUserBundle - 注册后自动登录

Symfony2 OneToMany 关系

Symfony2无效形式没有错误

symfony2 注销