我正在使用带有左连接的Doctrine执行DQL查询。
实体主管
/**
* @ORM\Table(name="presupuestos")
* @ORM\Entity(repositoryClass="Buv\MarketplaceBundle\Repository\LeadRepository")
*/
class Lead {
/**
* @var integer $id
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var LeadPayment $leadPayment
* @ORM\OneToMany(targetEntity="LeadPayment", mappedBy="lead")
*/
private $leadPayment;
...
实体LeadPayment
/**
* Buv\MarketplaceBundle\Entity\LeadPayment
*
* @ORM\Entity
* @ORM\Table(name="presupuestos_payment")
*/
class LeadPayment {
/**
* @var integer $id
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var integer $leadId
* @ORM\Column(name="presupuesto_id", type="integer", nullable=false)
*/
private $leadId;
/**
* @ORM\ManyToOne(targetEntity="Lead", inversedBy="leadPayment")
* @ORM\JoinColumn(name="presupuesto_id", referencedColumnName="id")
*/
private $lead;
...
实际上涉及的表更多,但我发现问题出在LeadPayment上,所以我简化了解释,不要在这里放置太多代码。
所以我做了以下DQL:
SELECT l, lp
FROM BuvMarketplaceBundle:Lead l
LEFT JOIN l.leadPayment lp
由于与leadPayment的关系,有些结果被跳过。如果我评论LEFT JOIN然后我得到正确的结果(但是然后需要使用leadPayment延迟加载所有记录)
奇怪的是,在我执行的SQL查询中,我在Symfony调试工具栏中看到效果很好而且结果是正确的。 问题似乎在于隐藏过程。
答案 0 :(得分:2)
您不必手动定义DebugEvent.TERMINATE
字段,Doctrine会为您处理。您也不需要$leadId
,因为您只是使用默认值。换句话说,在您的LeadPayment实体中替换此代码:
JoinColumn
只有这个:
/**
* @var integer $leadId
* @ORM\Column(name="lead_id", type="integer", nullable=false)
*/
private $leadId;
/**
* @ORM\ManyToOne(targetEntity="Lead", inversedBy="leadPayment")
* @ORM\JoinColumn(name="lead_id", referencedColumnName="id")
*/
private $lead;