Ich versuche, die Position der Entitätssammlung (Unterobjekte) für eine bestimmte Entität (Master-Entität) zu aktualisieren . Alles funktioniert, bis die Methode eine Flush-Anweisung ausführt, um Aktualisierungen in die Datenbank zu übertragen.Symfony 2: Fehler bei EntityManager :: Flush mit Nachricht "ArrayCollection :: __ construct() muss ein Array sein, Objekt gegeben"
Fehlermeldung ist:
Catchable Fatal Error: Argument 1 passed to Doctrine\Common\Collections\ArrayCollection::__construct() must be an array, object given, called in \vendor\doctrine\lib\Doctrine\ORM\UnitOfWork.php on line 426 and defined in \vendor\doctrine-common\lib\Doctrine\Common\Collections\ArrayCollection.php line 46
Controller-Methode ist:
public function layoutAction($id, $entity, $subentity)
{
//-- Get Repository for master entity class
$object = $this->getRepository($entity)->find($id);
$em = $this->getDoctrine()->getEntityManager();
//-- Get form datas
$datas = $this->get('request')->get('items', array());
//-- Update position for each msater entity childs of given subentity
$method = "get" . ucfirst($subentity) . "s";
foreach($object->$method() as $item){
$item->setPosition(array_search($item->getId(), $datas));
$em->persist($item);
}
//-- Push updates
$em->flush();
//-- Notification + Redirection
...
}
Master-Einheit hat eine Eins-zu-viele-Beziehung mit Sub-Entität und Sub-Entität hat eine Eins-zu-Eins-Beziehung mit Master-Einheit. Beispiel Erklärung unten:
Master-Einheit:
<one-to-many field="subentities" target-entity="Subentity" mapped-by="masterentity" />
Sub-Entität:
<one-to-one field="masterentity" target-entity="MasterEntity" inversed-by="subentities">
<join-column name="idMaster" referenced-column-name="idMaster" />
</one-to-one>
Ich verstehe nicht, warum dieser Fehler ausgelöst wird, aber ich glaube, dass es von Beziehung kommt.
Es war tatsächlich eine Eins-zu-Eins-Beziehung, die diesen Fehler verursachte. Wenn ich eins-zu-eins durch viele eins zu eins ersetze und mein Fehler verschwunden und Aktualisierung erfolgreich ist. Danke Meze! –