学说2 - 双向自引用一对多关系不起作用

时间:2017-06-19 15:46:22

标签: symfony doctrine-orm

我在我的模型上使用以下代码

    /**
 * 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有关吗?

2 个答案:

答案 0 :(得分:0)

ArrayCollection它有助于提高性能,增加延迟加载,排序和匹配(如果你已经访问过它,那么在数据库上如果没有加载数据也在phpside上)。

我个人非常喜欢使用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

答案 1 :(得分:0)

答案是延迟加载

如果不更改模型,则必须使用

$本期特价货品>的getChildren() - >的GetValues();

否则,您将不得不尝试注释以进行预先加载