2012-09-01 11 views
19

私は一対の関連があります。それらは多対多であり、明示的に作成されたエンティティを使用してそれらを結合するので、関係に関するメタデータを持つことができます。それらは同一であるが、一方は動作し、他方は動作しない。さらに悪いことに、先週、彼らは働いていたので、私はそれらに触れていません。 MuSQL Workbenchでは、正しいデータを選択できます。私のエンティティの1つにDoctrine PersistentCollectionを使用することはできません。もう1つは

データを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 

、私はエンティティ定義の関連部分が含まれます。私はこれとそれを試して時間を焼いた。私はあなたの提案に非常に感謝します。

THIS ONEワークス:

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

THIS ONEは、それが参照するエンティティpurchasesでエラーではありません

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

SOLVED !!これは参照元エンティティ(購入)のエラーでした。 mappedBy = "購入"と表示されます。それは '購入'でなければなりません。このエラーの結果は不可能であったことに注意してください。これは、ほとんど有用な方法ではリストできなかった巨大なデータ構造を作り出しました。それは触れたときに奇妙な結果をもたらした。 – tqwhite

+5

私は、Googleのために、この問題の解決策として、mappedByフィールド名が間違っていたということを言います。_ターゲットエンティティの実際の名前と一致しませんでした(この場合、購入エンティティスペルミスのエラーPurchaseOrderNodesのターゲット関連付け名)。複数の表名の命名規則のため、見るのがはるかに難しくなっています。その変態に注意してください! – tqwhite

+0

どうやってそれを見つけましたか?私はエンティティをデバッグするのが非常に難しいと思っていますが、これは私の問題かもしれませんが、どうすればわかりますか? – Andre

答えて

3

だったん。それはmappedBy="purchases"と言います。それはpurchaseでなければなりません。

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

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

複数のテーブル名の命名規則のため、見るのがはるかに難しくなりました。その変態に注意してください!

関連する問題