2015-11-30 33 views
0

我正在用左連接的Doctrine執行DQL查詢。Symfony hidrating限制左連接的結果數

實體鉛

/** 
* @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關係的結果。如果我評論左加入,然後我得到正確的結果(但後來需要延期加載所有記錄與leadPayment)

奇怪的是,在執行的SQL查詢執行,我看到在Symfony調試工具欄工程很好,結果是正確的。 這個問題似乎在進行中。

+1

爲什麼你定義'$ leadId'?這可能會破壞保溼功能,因爲它與'$ lead'是多餘的,並且該列具有相同的名稱。 – tchap

+0

@tchap我更新了phpdoc信息,因爲表和字段名稱不一樣(我在原始問題中忽略了這一點'cos我認爲如果不重要) – Sergi

+1

您仍然不需要'$ leadId'字段。 ..你的'找不到字段'的錯誤來自其他地方。清除緩存並創建一個新的數據庫來測試你的模型,但它應該運行良好 – tchap

回答

2

您不必手動定義$leadId字段,Doctrine爲您負責。您也不需要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; 

:換句話說,你LeadPayment實體替換此代碼

/** 
    * @ORM\ManyToOne(targetEntity="Lead", inversedBy="leadPayment") 
    */ 
    private $lead; 
+0

對不起,在我忽略了一些信息的問題,我認爲這並不重要,就像表名不一樣。我編輯了關於表格和實際字段名稱的信息。 順便說一句,我試圖避免定義$ leadId屬性,然後我得到「字段未找到」的錯誤。 – Sergi

+0

@Sergi您是否因爲遺留數據庫或其他原因而被綁定到這些名稱?通常最好避免任何自定義命名,並遵循約定,只要你可以。 – Oldskool

+0

是的,我需要維護BD名稱,以及類名和屬性。數據庫與另一個項目共享,在這個數據庫中有很多與Lead實體相關的代碼。 – Sergi