19

私には2つの協会があります。それらは多対多であり、明示的に作成されたエンティティを使用してそれらを結合し、関係に関するメタデータを取得できるようにします。それらは同一ですが、一方は機能し、もう一方は機能しません。さらに悪いことに、先週、それらは両方とも機能し、それ以来私はそれらに触れていません。MuSQL Workbenchで、正しいデータを選択できます。

1つの配列にデータを抽出するとき、人生は良いです。もう一方を試してみると、次のようになります。

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

1 に答える 1

3

参照元のエラーでしたpurchases。それは言うmappedBy="purchases"。する必要がありますpurchase

このエラーの結果は不可能であることに注意してください。それは、ほとんど有用な方法でリストすることができなかった巨大なデータ構造を生み出しました。触ると奇妙な結果になりました。

この問題の解決策は、mappedByフィールド名が正しくないことでした。ターゲットエンティティの実際の名前と一致しませんでした(この場合、Purchaseエンティティのエラーにより、のターゲットアソシエーション名のスペルが間違っていましたPurchaseOrderNodes)。

複数のテーブル名の命名規則により、見づらくなりました。その変化に気をつけろ!

于 2016-12-19T11:19:56.813 に答える