Liebe Community,
für ein Plugin erzeugen wir neue Doctrine-Models: Module und Element. Ein Module hat mehrere Elements, das Element kennt sein Module. Also eine bidirektionale Beziehung.
Wenn wir jetzt Objekte dieser Klassen erzeugen, wird leider die Beziehung der beiden Objekte zueinander nicht persistiert. Die Spalte module_id bleibt leer. Laut Doctrine-Doku sollte das aber genau so gehen. Kann da jemand weiterhelfen?
$module = new Module();
$module->setName('Modul 1');
Shopware()->Models()->persist($module);
$element = new Element();
$element->setModule($module);
Shopware()->Models()->persist($element);
Shopware()->Models()->flush();
Zudem ist es merkwürdig, dass man die extra Angabe des Feldes $moduleId benötigt - denn wenn man dieses Feld nicht angibt, erzeugt das SchemaTool beim Installieren des Plugins die Spalte nicht.
Die Module-Klasse:
/**
* @ORM\Entity
* @ORM\Table(name="neon_module")
*/
class Module extends ModelEntity
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer", length=11, options={"unsigned":true})
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var Element[] $elements
*
* @ORM\OneToMany(
* targetEntity="Element",
* mappedBy="module",
* cascade={"persist", "remove"}
* )
*/
protected $elements;
public function __construct()
{
$this->elements = new ArrayCollection();
}
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* @return Element[]
*/
public function getElements()
{
return $this->elements;
}
/**
* @param $element
*/
public function addElement($element)
{
$this->elements[] = $element;
}
/**
* @param Element[] $elements
* @return Module
*/
public function setElements($elements)
{
$this->elements = $elements;
return $this;
}
}
Die Element-Klasse:
/**
* @ORM\Entity
* @ORM\Table(name="neon_element")
*/
class Element extends ModelEntity
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer", length=11, options={"unsigned":true})
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var int
* @ORM\Column(name="module_id", type="integer")
*/
private $moduleId;
/* @var Module
* @ORM\ManyToOne(targetEntity="Module", inversedBy="elements")
* @ORM\JoinColumn(name="module_id", referencedColumnName="id")
*/
protected $module;
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* @return Module
*/
public function getModule()
{
return $this->module;
}
/**
* @param Module $module
* @return Element
*/
public function setModule($module)
{
$this->module = $module;
return $this;
}
}