我有一对协会。它们是多对多的,我使用显式创建的实体来加入它们,因此我可以获得关于关系的元数据。虽然它们是相同的,但是一个有效,另一个没有。更糟糕的是,上周,他们都工作了,从那时起我就没有接触过他们。在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();
答案 0 :(得分:3)
引用实体purchases
中出错。它说mappedBy="purchases"
。它应该是purchase
。
请注意,此错误的后果是不可能的。它产生了一个巨大的数据结构,几乎没有任何有用的方式列出。触摸后它给出了奇怪的结果。
此问题的解决方案是mappedBy字段名称不正确。它与目标实体中的实际名称不匹配(在这种情况下,Purchase
实体中的错误拼写了PurchaseOrderNodes
中的目标关联名称)。
由于多个表名的命名惯例,使得查看起来要困难得多。注意那个变化!