Tengo un par de asociaciones. Son muchos-a-muchos y utilizo una entidad creada explícitamente para unirme a ellos, así puedo tener metadatos sobre la relación. Aunque son idénticos, uno funciona y el otro no. Peor aún, la semana pasada, ambos trabajaron y no los he tocado desde entonces. En MuSQL Workbench, puedo seleccionar los datos correctos.No se puede usar Doctrine PersistentCollection para una de mis entidades, otra puedo
Cuando extraigo datos en una matriz para uno, la vida es buena. Cuando intento para el otro, me sale:
llamada a una función miembro
setValue()
en un no-objeto
también lo consigo cuando intento count()
él, acceder a ella ($blah[0]
) o iterar sobre él (foreach
).
cuando ejecuto:
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;
me sale:
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
A continuación, incluyo las partes pertinentes de las definiciones de entidades. Me he quemado horas intentando esto y lo otro. Estaré inmensamente agradecido por tus sugerencias.
Esta funciona:
//==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();
éste no
//==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();
SOLUCIONADO !! Fue un error en una entidad de referencia (compras). Dice mappedBy = "compras". Debe ser 'comprar'. Tenga en cuenta que las consecuencias de este error fueron imposibles. Produjo una enorme estructura de datos que no se podía enumerar de forma casi útil. Dio resultados extraños cuando se tocó. – tqwhite
Tal vez debería decir, por Google y claridad, _la solución a este problema fue que el nombre del campo mappedBy era incorrecto._ No coincidía con el nombre real en la entidad objetivo (en este caso, error en la entidad de compra mal escrito) el nombre de la asociación objetivo en PurchaseOrderNodes). Se hizo mucho más difícil de ver debido a la convención de nombres de nombres de tablas plurales. Cuidado con esa inflexión !! – tqwhite
¿Cómo lo encontraste al final? Me resulta muy difícil depurar mis entidades, este podría ser mi problema también, pero ¿cómo sé? – Andre