Database Symfony2 2.3.7-原则2.4.1:多个关系未保存到数据库
实体类别为GeLdapGrupo和GeMedio。他们之间建立了多对多的关系 尝试使用“、cascade={“persist”}”和不使用。我修改了与多对多关系相关的添加和删除元素方法。Fixture将数据放在ge_medio和ge_ldap_grupo表中,但不放在ge_ldap_grupo表(多对多关系表)中 头等舱:Database Symfony2 2.3.7-原则2.4.1:多个关系未保存到数据库,database,symfony,save,many-to-many,Database,Symfony,Save,Many To Many,实体类别为GeLdapGrupo和GeMedio。他们之间建立了多对多的关系 尝试使用“、cascade={“persist”}”和不使用。我修改了与多对多关系相关的添加和删除元素方法。Fixture将数据放在ge_medio和ge_ldap_grupo表中,但不放在ge_ldap_grupo表(多对多关系表)中 头等舱: /** * GeMedio * * @ORM\Table(name="ge_medio") * @ORM\Entity */ class GeMedio {
/**
* 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上没有数据
有人能帮我吗
非常感谢。无需坚持任何一种方式,添加多对多关系只能在一个方向上完成,这取决于您如何定义关系:添加只能由关系的父实体(所有者实体)完成,因此在您的情况下,您必须使用: $geldapgrupo->addGeMedio($gmedio) Symfony不会为此引发错误
你仍然需要坚持下去,谢谢你。与此同时,我将多对多关系转变为一对多对一关系,形成了一个“桥梁”实体。在未来,如果我有足够的时间、精力和更多的信息,我会尝试再次尝试那些现在明显有缺陷的多对多关系功能。