2017-10-11 129 views
0

我有2個表格,一個是GrowerProjection,一個是Crop。一個作物可以有許多與其相關的種植者預測。我帶着已經構建的底層數據庫進入了這個項目,在數據庫中,Crop有一個唯一的ID,例如CROP-001,存儲在名爲crop_ID的列中。在GrowerProjection表格中還有一個crop_ID字段,它可以讓你看到特定投影正在討論什麼。PHP/Symfony3/Doctrine關聯返回NULL

所以現在我已經使用Doctrine來生成實體,現在我正試圖將這些實體綁定在一起。當我嘗試創建一個ManyToOne關聯時,我總是返回一個空值。我的問題是:1.我做錯了什麼,以及2.我將來如何調試這些類型的問題?

我已經嘗試驗證架構並通過控制檯更新架構,但似乎沒有效果。

下面是Growerprojection的實體相關剪斷:


/** 
* Growerprojection 
* 
* @ORM\Table(name="growerProjection") 
* @ORM\Entity 
*/ 
class Growerprojection 
{ 
    /** 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="Crop") 
    * @ORM\JoinColumn(name="cropId", referencedColumnName="cropId") 
    */ 
    private $crop; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="grower_ID", type="string", length=16, nullable=false) 
    */ 
    private $growerId; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="crop_ID", type="string", length=16, nullable=false) 
    */ 
    private $cropId; 

    public function getReadyToLoadDt() { 
     return $this->prjreadytoloaddt; 
    } 

    public function setReadyToLoadDt($theDate) { 
     $this->prjreadytoloaddt=$theDate; 
    } 

    public function getCrop() { 
     return $this->crop; 
    } 

} 

我曾嘗試與聯接列crop_ID和cropId,作爲指導思想是用cropId但實際的表使用crop_ID。我嘗試過使用和不使用@ID指令。不用找了。裁剪始終爲空。

這裏是作物實體部分:


/** 
* Crop 
* 
* @ORM\Table(name="crop") 
* @ORM\Entity 
*/ 
class Crop 
{ 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="commodity_ID", type="string", length=16, nullable=false) 
    */ 
    private $commodityId; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="crop_ID", type="string", length=16) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $cropId; 

    public function getCommodityID() { 
     return $this->commodityId; 
    } 
} 

然後,這裏是控制器的動作:


    public function testAction(Request $request) 
    { 
     $repository = $this->getDoctrine()->getRepository('AppBundle:Growerprojection'); 
     $projections = $repository->findBy(
      array('growerId' => 'GROW-001'), 
      array('prjreadytoloaddt' => 'ASC') 
      ); 
     $myCrop = $projections[0]->getCrop(); 
     \Doctrine\Common\Util\Debug::dump($myCrop); 
     return $this->render('grower/growerTest.html.twig', 
      array('projections' => $projections)); 
    } 

此找到種植者投影,即種植者投影具有CROP-001作爲cropId,並且crop_ID爲CROP-001的作物表中有作物。

line \ Doctrine \ Common \ Util \ Debug :: dump($ myCrop);將始終生成NULL,並且當我在樹枝中執行dump()時,我還會看到投影到達並且已填充,但列裁剪爲空。

我在做什麼錯在這裏,我如何得到這個協會的工作,以及我將來如何調試這個,所以我不必糾纏它們嗎?

回答

0

這裏發生了什麼:

的數據表沒有內置的外鍵約束,我不能讓他們的工作,所以我開始了不同的項目,複製幾個學說文件,並用。來自Scorpion建議的建議形式。然後我有教義創建模式,然後協會工作。這裏的計劃是備份當前數據庫中的數據,編輯所有的學說文件以建立關聯,然後讓原則正確地用外鍵重新創建數據庫。

0

對於類的映射,@ORM\JoinColumnnamereferencedColumnName字段的值必須是sql表的實際列名,而不是字段名。請參閱Doctrine docs以供參考。

你的代碼看起來應該是這樣


/** 
* Growerprojection 
* 
* @ORM\Table(name="growerProjection") 
* @ORM\Entity 
*/ 
class Growerprojection 
{ 
    /** 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="Crop") 
    * @ORM\JoinColumn(name="crop_ID", referencedColumnName="crop_ID") 
    */ 
    private $crop; 

    ... 

} 

然而,我還沒有發現一個簡單的方法來調試這些類型的錯誤。最適合我的是,在建立協會的時候要特別小心。

+0

您好!我剛剛嘗試過,結果沒有發生變化。我注意到在Symfony調試欄中,它只做了1個數據庫查詢。 –

+0

好吧,聽起來不太好。我還有3個想法:1.您是否嘗試過也刪除@ORM\Id?這可能與測繪有衝突。 2.您是否在更改映射後用bin/console cache:clear --no-warmup清理了緩存? 3.數據庫中是否有外鍵映射,就像它是文檔中的映射結果一樣? – Scorpio

+0

我相信這裏的問題可能是缺少數據庫中的外鍵映射。但是,當我在數據庫中創建它們並導出結構時,我看不到引用外鍵約束。當我告訴doctrine schema:create --dumpsql時,它轉儲的SQL也沒有提到外鍵約束。我認爲我看到了問題,但仍然對修復感到困惑! –