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