Symfony hidrating限制左连接的结果数

时间:2015-11-30 11:45:17

标签: php mysql symfony doctrine-orm

我正在使用带有左连接的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调试工具栏中看到效果很好而且结果是正确的。 问题似乎在于隐藏过程。

1 个答案:

答案 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;