Подтвердить что ты не робот

Невозможно использовать Doctrine PersistentCollection для одного из моих сущностей, другое я могу

У меня есть пара ассоциаций. Они много-ко-многим, и я использую явно созданный объект, чтобы присоединиться к ним, чтобы у меня были метаданные об отношениях. Хотя они идентичны, один работает, а другой - нет. Хуже того, на прошлой неделе они оба работали, и с тех пор я их не трогал. В MuSQL Workbench я могу выбрать правильные данные.

Когда я извлекаю данные в массив для одного, жизнь хороша. Когда я пытаюсь другой, я получаю:

Вызов функции-члена setValue() для не-объекта

Я также получаю его, когда пытаюсь count() его, получить к нему доступ ($blah[0]) или перебрать его (foreach).

Когда я выполняю:

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;

Я получаю:

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

Ниже я включаю соответствующие определения сущностей. Я сожгла часы, пытаясь что-то делать. Я буду очень благодарен за ваши предложения.

ЭТО ОДИН РАБОТАЕТ:

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

ЭТО ОДИН НЕ

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

Ответ 1

Это была ошибка в объекте привязки purchases. Он говорит mappedBy="purchases". Это должно быть purchase.

Обратите внимание, что последствия этой ошибки были невозможны. Он создал огромную структуру данных, которая не может быть указана практически любым полезным способом. Это принесли причудливые результаты.

Решение этой проблемы состояло в том, что имя поля MappedBy было неверным. Он не соответствовал фактическому имени в целевом объекте (в этом случае ошибка в объекте purchase запустила имя целевой ассоциации в PurchaseOrderNodes).

Было сделано гораздо труднее увидеть из-за соглашения об именах имен множественных таблиц. Следите за этим перегибом!