我在我的模型上使用以下代码
/**
* 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;
}
我正在使用Entity manager来获取存储库并使用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和文档上搜索了很多,但我找不到任何有用的东西。
如果我遗漏了一些明显的东西,我会很感激第二次查看我的代码。谢谢你的时间
===========更新==================
经过一些调查后,似乎为孩子们返回的对象是PersistentCollection。 这意味着我必须执行
$本期特价货品>的getChildren() - >的GetValues();
获得真正的孩子
有关如何避免这种情况并直接在属性上获取值的任何想法?可能与获取模式设置为EAGER有关吗?
答案 0 :(得分:0)
ArrayCollection它有助于提高性能,增加延迟加载,排序和匹配(如果你已经访问过它,那么在数据库上如果没有加载数据也在phpside上)。
我个人非常喜欢使用ArrayCollection,但你可以通过以下方式摆脱它更新你的实体:
/**
* @return array
*/
public function getChildren()
{
return $this->children->toArray();
}
答案 1 :(得分:0)
答案是延迟加载
如果不更改模型,则必须使用
$本期特价货品>的getChildren() - >的GetValues();
否则,您将不得不尝试注释以进行预先加载