Php Can';Don’我不能为我的一个实体使用Doctrine PersistentCollection,我可以为另一个实体使用Doctrine PersistentCollection

Php Can';Don’我不能为我的一个实体使用Doctrine PersistentCollection,我可以为另一个实体使用Doctrine PersistentCollection,php,doctrine-orm,Php,Doctrine Orm,我有两种联想。它们是多对多的,我使用显式创建的实体来连接它们,这样我就可以拥有关于关系的元数据。虽然它们是相同的,但一个有效,另一个无效。更糟糕的是,上周,他们都工作了,从那以后我就再也没有碰过他们。在musqlworkbench中,我可以选择正确的数据 当我将数据提取到一个数组中时,生活是美好的。当我尝试另一个时,我得到: 对非对象调用成员函数setValue() 当我尝试count()它、访问它($blah[0])或迭代它(foreach)时,我也会得到它 当我执行: echo get_cl

我有两种联想。它们是多对多的,我使用显式创建的实体来连接它们,这样我就可以拥有关于关系的元数据。虽然它们是相同的,但一个有效,另一个无效。更糟糕的是,上周,他们都工作了,从那以后我就再也没有碰过他们。在musqlworkbench中,我可以选择正确的数据

当我将数据提取到一个数组中时,生活是美好的。当我尝试另一个时,我得到:

对非对象调用成员函数
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;
下面,我将介绍实体定义的相关部分。我花了好几个小时来尝试这个和那个。我将非常感谢你的建议

这一个有效:

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

这是一个参考实体
采购
中的错误。上面写着
mappedBy=“purchases”
。它应该是
purchase

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

此问题的解决方案是mappedBy字段名不正确。它与目标实体中的实际名称不匹配(在本例中,
采购
实体中的错误拼写了
采购订单节点
中的目标关联名称)


由于复数表名的命名约定,它变得更加难以查看。小心那个拐点

解决了!!这是引用实体(采购)中的错误。上面写着mappedBy=“购买”。应该是“购买”。请注意,此错误的后果是不可能的。它产生了一个巨大的数据结构,几乎无法以任何有用的方式列出。当触摸它时,它会产生奇怪的结果。也许我应该说,为了谷歌的缘故,为了清晰起见,这个问题的解决方案是mappedBy字段名不正确。它与目标实体中的实际名称不匹配(在本例中,采购实体中的错误拼写了PurchaseOrderNodes中的目标关联名称)。由于复数表名的命名约定,它变得更加难以查看。小心那个拐点!!你最后是怎么发现的?我发现调试我的实体非常困难,这可能也是我的问题,但我怎么知道呢?@Andre尝试使用
vendor/bin/doctor orm:validate schema
在Symfony 2的情况下使用
app/console doctor:schema:validate
这将报告任何无效的实体映射@请创建一个答案并接受它,以将此问题标记为已解决。
//==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();