Symfony自引用实体方法不返回实体

问题描述 投票:0回答:1

我有自引用菜单实体(使用make:entity创建:]:

     /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Menu", inversedBy="children")
     */
    private $parent;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Menu", mappedBy="parent")
     */
    private $children;

和数据:

| id | name      | parent |
|----|-----------|--------|
| 1  | MainItem  | null   |
| 2  | Child 1-1 | 1      |
| 3  | Child 1-2 | 1      |
| 4  | Child 1-3 | 1      |

我获得顶层菜单项的功能:

private function getTopMenu (MenuRepository $menuRepository) {
        return $menuRepository->findBy(['parent' => null]);
    }

返回以下内容:

array:1 [▼
  0 => Menu^ {#1186 ▼
    -id: 1
    -name: "MainItem"
    -parent: null
    -children: PersistentCollection^ {#1188 ▼
      -snapshot: []
      -owner: Menu^ {#1186}
      -association: array:15 [ …15]
      -em: EntityManager^ {#1050 …11}
      -backRefFieldName: "parent"
      -typeClass: ClassMetadata {#1096 …}
      -isDirty: false
      #collection: ArrayCollection^ {#1189 ▼
        -elements: []
      }
      #initialized: false
    }
  }
]

由于我的孩子没有任何东西,所以我尝试使用$menuRepository->find(2)->getParent();向后工作,该返回的内容是:

Menu^ {#1205 ▼
  +__isInitialized__: false
  -id: 1
  -name: null
  -parent: null
  -children: null
   …2
}

最后我尝试了$menuRepository->find(2)->setParent($menuRepository->find(3))->getParent(),但最终似乎使我到了某个地方:

Menu^ {#1201 ▼
  -id: 3
  -name: "Child 1-2"
  -parent: Menu^ {#1205 ▶}
  -children: PersistentCollection^ {#1200 ▶}
}

我不知道为什么getChildrengetParent没有返回数据。

symfony doctrine
1个回答
0
投票

从父母那里接触孩子应该起作用。相反也。

首先,请确保您的构造函数为孩子声明一个新的ArrayCollection。使用OneToMany关系时非常重要,因为Doctrine使用ArrayCollection正确加载子级数据。

use Doctrine\Common\Collections\ArrayCollection;

...

public function __construct(){
    $this->children = new ArrayCollection();
}

如果仍然无法解决问题,我建议尝试更改实体映射的提取模式。

/**
 * @ORM\OneToMany(targetEntity="App\Entity\Menu", mappedBy="parent", fetch="EAGER")
 */
private $children;

小心,急切的获取模式将在第一次数据库检索时加载整个阵列。通常,该学说将使用延迟加载,这会在使用get()方法时触发数据库调用。急切的获取模式可能很危险,因为在Eveytime时您将查询菜单,所有子级也将被加载,这可能会产生很大的开销。

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.