不能为我的一个实体使用Doctrine PersistentCollection,另一个我可以

tqw*_*ite 19 php doctrine-orm

我有一对协会.它们是多对多的,我使用显式创建的实体来加入它们,因此我可以获得关于关系的元数据.虽然它们是相同的,但是一个有效,另一个没有.更糟糕的是,上周,他们都工作了,从那时起我就没有接触过他们.在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;
Run Code Online (Sandbox Code Playgroud)

我明白了:

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
Run Code Online (Sandbox Code Playgroud)

下面,我包括实体定义的相关部分.我已经烧了几个小时尝试这个和那个.我非常感谢你的建议.

这一个工作:

//==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();
Run Code Online (Sandbox Code Playgroud)

这一个没有

//==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();
Run Code Online (Sandbox Code Playgroud)

k0p*_*kus 3

这是引用实体中的错误purchases。它说mappedBy="purchases"。它应该是purchase

请注意,此错误的后果是不可能的。它产生了一个巨大的数据结构,几乎无法以任何有用的方式列出。触摸时会产生奇怪的结果。

这个问题的解决办法是mappedBy字段名不正确。它与目标实体中的实际名称不匹配(在这种情况下,实体中的错误Purchase将 中的​​目标关联名称拼写错误PurchaseOrderNodes)。

由于复数表名的命名约定,它变得更加难以查看。留意这种变化!