我正在从Doctrine 1.2迁移到Doctrine 2.1,而且我遇到的问题应该是简单的连接
这是我的第一张表:
/**
* 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());
}
所以我希望看到wbsfunds表中的基金代码和wbs与我首次搜索的wbs相关联。 (我输入 - &gt; WBS-&gt; 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-&gt; FUND-&gt; geFundCode()之间的链接效果很好,wbsfundobj-&gt; WBS-&gt; getWBS()也是如此,但是从WBS到WBS_FUNDS的链接似乎是错误的。
答案 0 :(得分:0)
通常,您在存储库上为实体调用find()
。类似的东西:
// $em is your Entity Manager instance
$testEntity = $em->getRepository('\Model_Wbs')->find(7185);
// or a shorcut
$testEntity = $em->find('\Model_Wbs', 7185);
如何获得对EntityManager的引用取决于您如何引导Doctrine。如果您使用了Bisna application resource plugin,那么它就像(在控制器中):
$em = $this->getInvokeArg('bootstrap')->getResource('doctrine')->getEntityManager();
通常,我将它放入控制器的init()
方法中,或编写一个封装上述步骤的动作助手,以便我可以使用以下内容调用它:
$em = $this->_helper->doctrine->getEntityManager();