2017-06-19 115 views
0

我使用下面的代碼在我的模型學說2 - 雙向自引用一對多關係不工作

/** 
* Many Categories have One Category 
* @ORM\ManyToOne(targetEntity="ItemCategory", inversedBy="children") 
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id") 
*/ 
public $parent; 

/** 
* One Category has many Categories 
* @ORM\OneToMany(targetEntity="ItemCategory", mappedBy="parent") 
*/ 
public $children; 

/** 
* ItemCategory constructor. 
*/ 
public function __construct() 
{ 
    $this->children = new \Doctrine\Common\Collections\ArrayCollection(); 
    $this->parent_id = 0; 
} 

/** 
* @return ItemCategory 
*/ 
public function getParent() 
{ 
    return $this->parent; 
} 

/** 
* @param mixed $parent 
*/ 
public function setParent($parent) 
{ 
    $this->parent = $parent; 
} 

/** 
* @return ArrayCollection 
*/ 
public function getChildren() 
{ 
    return $this->children; 
} 

我用這與實體管理器,以獲得資源庫和使用的findAll()來獲取在返回公共屬性的json的控制器上使用的所有結果。

$em = $this->getDoctrine()->getManager(); 
    $repository = $em->getRepository("AppBundle:Item\ItemCategory"); 
    $categories = $repository->findAll(); 
    return new JsonResponse(array("item_categories" => $categories)); 

Symfony沒有拋出任何錯誤,而ManyToOne方面沒有問題,並且使用完整對象來表達父屬性。

OneToMany方面雖然我試過,但仍然是空的。

結果數組包含看起來像

{ "id": 8, "parent": { "id": 3, "parent": null, "children": {}, "name": "Ανταλλακτικά", "description": "", "meta_description": "", "icon": "cogs" }, "children": {}, "name": "Ποδηλάτων", "description": "", "meta_description": "", "icon": "" },

我尋覓了很多在這裏stackexchange和文檔上的對象,但我能找到什麼工作的。

我希望再次看看我的代碼,以防萬一我失去了一些明顯的東西。感謝您的時間

=========== UPDATE ==================

經過一番更多的調查,看來爲兒童返回的對象是PersistentCollection。 這意味着我必須執行

$ item-> getChildren() - > GetValues();

獲得實際的孩子

我如何能避免這一點,對房地產直接獲取值有什麼想法?可能與EAGER設置的獲取模式有關?

+0

實驗? –

+0

感謝您的回覆。我實際上必須執行 $ item-> getChildren() - > GetValues(); 得到數組 – Dimitris

+0

這聽起來像是問題;除非我很瘋狂,否則你會想要一個'DoctrineCollection'而不是從該getter返回的'array' ... –

回答

0

答案是懶加載

如果不更改型號,您必須使用

$ i透射電鏡>的getChildren() - >的GetValues();

否則,你將不得不與是否`$父 - >的getChildren()`返回的項目的`DoctrineCollection`預期爲註釋積極加載

0

ArrayCollection它有助於提高性能,添加延遲加載,排序和匹配(如果數據庫還沒有加載數據,如果您已經訪問過它,則在數據庫上)。

個人而言,我真的很喜歡與ArrayCollection的工作,但你可以擺脫掉它更新以下列方式你的實體:

/** 
* @return array 
*/ 
public function getChildren() 
{ 
    return $this->children->toArray(); 
} 

過濾集合: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html#filtering-collections