2012-09-01 10 views
19

Mam parę powiązań. Są one wiele-do-wielu i używam jawnie stworzonego bytu, aby do nich dołączyć, abym mógł mieć metadane dotyczące relacji. Choć są identyczne, jeden działa, a drugi nie. Co gorsza, w zeszłym tygodniu oboje pracowali i od tego czasu ich nie dotykałem. W MuSQL Workbench mogę wybrać poprawne dane.Nie można użyć Doctrine PersistentCollection dla jednej z moich jednostek, innej mogę

Kiedy wyodrębniam dane do tablicy dla jednego, życie jest dobre. Kiedy próbuję za drugą, otrzymuję:

Zaproszenie do funkcji składowej setValue() na brak przedmiotu

Ja też się go przy próbie count() go, dostęp on ($blah[0]) lub iteruj nad nim (foreach).

Kiedy wykonać:

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; 

uzyskać:

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 

Poniżej I zawierają istotne elementy definicji podmiotu. Spaliłem godziny próbując tego i tego. Będę niezmiernie wdzięczny za twoje sugestie.

Ten działa:

//==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(); 

ten nie

//==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

SOLVED !! Był to błąd w podmiocie odwołującym się (zakupy). Mówi mappedBy = "zakupy". Powinien to być "zakup". Należy pamiętać, że konsekwencje tego błędu były niemożliwe. Stworzyło ogromną strukturę danych, której nie można było wymieniać w niemal żaden użyteczny sposób. Dało to dziwne rezultaty po dotknięciu. – tqwhite

+5

Może powinienem powiedzieć, ze względu na Google'a i jasność, rozwiązanie tego problemu polegało na tym, że nazwa pola mappedBy była niepoprawna. _ Nie pasowało do rzeczywistej nazwy w jednostce docelowej (w tym przypadku błąd w kodzie zakupu został błędnie napisany docelowa nazwa asocjacji w PurchaseOrderNodes). Stało się to o wiele trudniejsze ze względu na konwencję nazewnictwa wielu nazw tabel. Uważaj na tę odmianę !! – tqwhite

+0

Jak to się stało, że w końcu? Bardzo trudno jest debugować moje podmioty, to może być również mój problem, ale skąd mam wiedzieć? – Andre

Odpowiedz

3

Czy to był błąd w jednostce odsyłania purchases. Jest napisane: mappedBy="purchases". Powinno to być purchase.

Należy pamiętać, że konsekwencje tego błędu były niemożliwe. Stworzyło ogromną strukturę danych, której nie można było wymieniać w niemal żaden użyteczny sposób. Dało to dziwne rezultaty po dotknięciu.

Rozwiązanie tego problemu polegało na tym, że nazwa pola mappedBy była niepoprawna. Nie zgadza się z rzeczywistą nazwą w obiekcie docelowym (w tym przypadku błąd w jednostce Purchase zawiera literówkę o nazwie powiązania docelowego w PurchaseOrderNodes).

To było znacznie trudniejsze do zobaczenia ze względu na konwencję nazewnictwa wielu nazw tabel. Uważaj na tę fleksję!

Powiązane problemy