2012-09-01 10 views
19

Ich habe ein Paar von Assoziationen. Sie sind viele-zu-viele und ich verwende eine explizit erstellte Entität, um sie zu verbinden, damit ich Metadaten über die Beziehung haben kann. Obwohl sie identisch sind, funktioniert das eine und das andere nicht. Schlimmer noch, letzte Woche haben beide gearbeitet und ich habe sie seitdem nicht mehr berührt. In der MuSQL Workbench kann ich die richtigen Daten auswählen.Doctrine PersistentCollection kann nicht für eine meiner Entitäten verwendet werden, eine andere kann ich

Wenn ich Daten in ein Array für eins extrahiere, ist das Leben gut. Wenn ich für die anderen versuchen, erhalte ich:

Anruf auf eine Elementfunktion setValue() auf einem Nicht-Objekt

ich es auch, wenn ich zu count() es versuchen, Zugang it ($blah[0]) oder Iteriere darüber (foreach).

Wenn ich ausführen:

echo get_class($inData)."<BR>"; 
echo get_class($inData->accountPurchaseNodes)."<BR>"; 
echo get_class($inData->accountPurchaseNodes[0])."<BR>"; 
echo "<HR>"; 

echo get_class($inData)." x<BR>"; 
echo get_class($inData->purchaseOrderNodes)."<BR>"; 
echo get_class($inData->purchaseOrderNodes[0])."<BR>"; 
echo "<HR>"; 
exit; 

ich:

GE\Entity\Purchase 
Doctrine\ORM\PersistentCollection 
GE\Entity\AccountPurchaseNode 

GE\Entity\Purchase 
Doctrine\ORM\PersistentCollection 

(!) Fatal error: Call to a member function setValue() on a non-object in 
/Users/tqwhite/Documents/webdev/goodEarth/goodearth.com/library/ 
Doctrine/ORM/PersistentCollection.php on line 168 

Unten I umfassen die relevanten Teile der Entity-Definitionen. Ich habe Stunden damit verbracht, dies und das zu versuchen. Ich werde immens dankbar für Ihre Vorschläge sein.

Dies funktioniert:

//==Purchase Entity===================================== 

/** 
* @param \Doctrine\Common\Collections\Collection $property 
* @OneToMany(targetEntity="AccountPurchaseNode", mappedBy="account", cascade={"persist", "remove"}); 
*/ 
private $accountPurchaseNodes; 

//in __construct() 
$this->accountPurchaseNodes = new \Doctrine\Common\Collections\ArrayCollection(); 


//==AccountPurchaseNode Entity===================================== 

/** 
* 
* @ManyToOne(targetEntity="Purchase", cascade={"all"}, fetch="EAGER") 
* @JoinColumn(name="purchaseRefId", referencedColumnName="refId") 
* 
**/ 
private $purchase; 

/** 
* 
* @ManyToOne(targetEntity="Account", cascade={"all"}, fetch="EAGER") 
* @JoinColumn(name="accountRefId", referencedColumnName="refId") 
* 
**/ 
private $account; 


//==Account Entity===================================== 

/** 
* @param \Doctrine\Common\Collections\Collection $property 
* @OneToMany(targetEntity="AccountPurchaseNode", mappedBy="purchase", cascade={"persist", "remove"}); 
*/ 
private $accountPurchaseNodes; 

//in __construct() 
$this->accountPurchaseNodes = new \Doctrine\Common\Collections\ArrayCollection(); 

Dies nicht

//==Purchase ===================================== 

/** 
* @param \Doctrine\Common\Collections\Collection $property 
* @OneToMany(targetEntity="PurchaseOrderNode", mappedBy="purchases", cascade={"persist", "remove"}); 
*/ 
private $purchaseOrderNodes; 

//in __construct() 
$this->purchaseOrderNodes = new \Doctrine\Common\Collections\ArrayCollection(); 


//==PurchaseOrderNode ===================================== 

/** 
* 
* @ManyToOne(targetEntity="Purchase", cascade={"all"}, fetch="EAGER") 
* @JoinColumn(name="purchaseRefId", referencedColumnName="refId") 
* 
**/ 
private $purchase; 

/** 
* 
* @ManyToOne(targetEntity="Order", cascade={"all"}, fetch="EAGER") 
* @JoinColumn(name="orderRefId", referencedColumnName="refId") 
* 
**/ 
private $order; 


//==Order ===================================== 

/** 
* @param \Doctrine\Common\Collections\Collection $property 
* @OneToMany(targetEntity="PurchaseOrderNode", mappedBy="order", cascade={"persist", "remove"}); 
*/ 
private $purchaseOrderNodes; 

//in __construct() 
$this->purchaseOrderNodes = new \Doctrine\Common\Collections\ArrayCollection(); 
+6

Gelöst !! Es war ein Fehler in einer referenzierenden Entität (Käufe). Es heißt mappedBy = "Käufe". Es sollte "Kauf" sein. Bitte beachten Sie, dass die Folgen dieses Fehlers nicht möglich waren. Es erzeugte eine riesige Datenstruktur, die nicht in fast jeder nützlichen Weise aufgelistet werden konnte. Es gab bizarre Ergebnisse bei Berührung. – tqwhite

+5

Vielleicht sollte ich sagen, um googles willen, und Klarheit, _die Lösung für dieses Problem war, dass der Feldname mappedBy incorrect._ Es stimmte nicht mit dem tatsächlichen Namen in der Zieleinheit (in diesem Fall, Fehler in der Bestellung Entität falsch geschrieben Name der Zielverknüpfung in PurchaseOrderNodes). Es wurde aufgrund der Namenskonvention der Plural Tabellennamen viel schwieriger zu sehen. Passen Sie auf diese Beugung auf !! – tqwhite

+0

Wie hast du das am Ende gefunden? Ich finde es sehr schwer, meine Entitäten zu debuggen, das könnte mein Problem sein, aber woher weiß ich das? – Andre

Antwort

3

Es war ein Fehler in einer verweisende Entität purchases. Es sagt mappedBy="purchases". Es sollte purchase sein.

Bitte beachten Sie, dass die Folgen dieses Fehlers nicht möglich waren. Es erzeugte eine riesige Datenstruktur, die nicht in fast jeder nützlichen Weise aufgelistet werden konnte. Es gab bizarre Ergebnisse bei Berührung.

Die Lösung für dieses Problem bestand darin, dass der Feldname mappedBy falsch war. Es stimmt nicht mit dem tatsächlichen Namen in der Zielentität überein (in diesem Fall hat der Fehler in der Purchase Entität den Zielverknüpfungsnamen in PurchaseOrderNodes falsch geschrieben).

Es wurde viel schwieriger zu sehen, wegen der Namenskonvention von Plural Tabellennamen. Pass auf diese Flexion auf!

Verwandte Themen