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

时间:2013-11-27 10:01:01

标签: database symfony save many-to-many

实体分支是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 个答案:

答案 0 :(得分:0)

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

$ geldapgrupo-> addGeMedio($ gmedio);

Symfony不会因此而引发错误。

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