2012-02-02 10 views
0

に入社し、単純結合どうあるべきかとの問題を抱えていますトラブルがテーブル私は教義2.1に教義1.2から移行しています

これが私の最初のテーブルです:

/** 
* Model_WBS 
* 
* @Table(name="WBS") 
* @Entity 
*/ 
class Model_Wbs 
    /** 
    * @var integer $id 
    * 
    * @Column(name="id", type="integer", length=8) 
    * @Id 
    * @GeneratedValue(strategy="SEQUENCE") 
    * @SequenceGenerator(sequenceName="wbs_seq_seq", allocationSize=1, initialValue=1) 
    */ 
    public $id; 
    . 
    . 
    . 
    /** 
    * @var \Doctrine\Common\Collections\ArrayCollection 
    * 
    * @OneToMany(targetEntity="Model_WbsFund", mappedBy="id") 
    * @JoinColumn(name="id", referencedColumnName="wbs_id") 
    */ 
    public $wbsfunds; 

そして、これは私の第二でありますここでは、テーブル

/** 
* Model_WbsFund 
* 
* @Table(name="WBS_FUNDS") 
* @Entity 
*/ 
class Model_WbsFund  
/** 
    * @var integer $id 
    * 
    * @Column(name="id", type="integer", length=8) 
    * @Id 
    * @GeneratedValue(strategy="SEQUENCE") 
    * @SequenceGenerator(sequenceName="wbs_funds_seq_seq", allocationSize=1, initialValue=1) 
    */ 
public $id; 

/** 
* @var integer $wbs_id 
* 
* @Column(name="wbs_id", type="integer", length=8) 
*/ 
public $wbs_id; 
. 
. 
. 
    /** 
    * @var \Doctrine\Common\Collections\ArrayCollection 
    * 
    * @ManyToOne(targetEntity="Model_Wbs", inversedBy="wbs_id") 
    * @JoinColumn(name="wbs_id", referencedColumnName="id") 
    */ 
    public $WBS; 

そして、私の簡単なテストである

$testEntity = Model_Wbs::find(7185); 
foreach($testEntity->getwbsfunds() as $wbsfundobj){ 
    print("<br/>"); 
    print($wbsfundobj->FUND->getFundCode()." -- ".$wbsfundobj->WBS->getWbs()); 
} 

私は最初に検索したwbsに関連付けられているwbsfundsテーブルのファンドコードとwbsを見ることになります。 (私はWBS-> getWbs()を使って、実際にwbs id 7185に関連した資金しか得られていないかどうかを確認しました)。

代わりに、私はすべてのwbs_fundsレコードを取得します。私は、生成されたクエリステートメントの教義をプリントアウトし、それは正しくないのです

SELECT t0.id AS ID1, t0.wbs_id AS WBS_ID2, t0.fund_id AS FUND_ID3, t0.wbs_id AS WBS_ID4, t0.fund_id AS FUND_ID5 FROM WBS_FUNDS t0 

興味深いのは、wbsfundobj-> WBS-> getWBSがそうであるようにwbsfundobj-> FUND-の間のリンク> geFundCodeは、()(、素晴らしい作品ということです)、WBSからWBS_FUNDSへのリンクは間違っているようです。

+0

公開された属性の代わりに保護された属性を使用することをお勧めします。 http://stackoverflow.com/questions/4090609/how-can-public-fields-break-lazy-loading-in-doctrine-2 – Florian

答えて

0

通常、エンティティのリポジトリでは、find()を呼び出します。次のようなものがあります。

// $em is your Entity Manager instance 
$testEntity = $em->getRepository('\Model_Wbs')->find(7185); 

// or a shorcut 
$testEntity = $em->find('\Model_Wbs', 7185); 

Doctrineをどのようにブートストラップしたかによって、EntityManagerへの参照はどのようになりますか。あなたがBisna application resource pluginを使用した場合、それは(コントローラ内)のようになります。一般的に、私は、コントローラのinit()メソッドにこれを入れ

$em = $this->getInvokeArg('bootstrap')->getResource('doctrine')->getEntityManager(); 

または私はそれを呼び出すことができるように、上記の手順をカプセル化するアクションヘルパーを書きます

$em = $this->_helper->doctrine->getEntityManager();