检索父母和子女 - 自我引用实体

时间:2014-03-14 12:56:05

标签: symfony doctrine-orm self-reference

Noob在这里。我会说我可以看到曲线的高峰,但我还有很长的路要走。

我有一个引用类别表的实体(tblxchangecategories):

enter image description here

这与引用类别层次结构表的实体(tblxchangecategory_hier)有关:

enter image description here

这种关系是自我引用的。

父母有6个主要类别,其余类别(36个)都是孩子。

这就是我在实体文件中定义关系的方式(tblxchangecategories):

/**
     * @OneToMany(targetEntity="TblXchangecategories", mappedBy="children")
     **/
    private $parent;

    /**
     * @ManyToOne(targetEntity"TblXchangecategories", inversedBy="parent")
     * @JoinTable(name="tbl_xchangecategory_hier",
     *      joinColumns={@joinColumn(name="hier_parent", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="hier_child", referencedColumnName="id")}
     */
    private $children;

在另一个权利文件(tblxchangecategory_hier)中:

/**
     * @var \WorkoutExchange\WXCoreBundle\Entity\TblXchangecategories
     *
     * @ORM\OneToMany(targetEntity="WorkoutExchange\WXCoreBundle\Entity\TblXchangecategories")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="hier_parent", referencedColumnName="id")
     * })
     */
    private $hierParent;

    /**
     * @var \WorkoutExchange\WXCoreBundle\Entity\TblXchangecategories
     *
     * @ORM\ManyToOne(targetEntity="WorkoutExchange\WXCoreBundle\Entity\TblXchangecategories")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="hier_child", referencedColumnName="id")
     * })
     */
    private $hierChild;

使用以下代码,我可以检索拼合数组中的所有类别(无关系):

$categories = $em->getRepository('WorkoutExchangeWXCoreBundle:TblXchangecategories')->findAll();

我可以设置视图,这样就没问题,它会从数据库中获取导致我麻烦的数据。

我在我的几个搜索中看到过对->getChildren()功能的引用,但我的实体定义文件中没有这个功能。

我想要的是让所有实体都被填充,这样当我显示它们时,我可以使用父项作为标题,父母下面的子项是这样的:

enter image description here

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

你的关系错了,试试这个:

/**
 * @var TblXchangecategories
 *
 * @ORM\ManyToOne(targetEntity="TblXchangecategories")
 * @ORM\JoinColumn(name="hier_parent", referencedColumnName="id")
 * 
 */
private $hierParent;

/**
 * @var TblXchangecategories
 *
 * @ORM\OneToMany(targetEntity="TblXchangecategories", mappedBy="hierParent")
 */
private $hierChildren;

答案 1 :(得分:0)

我认为如果它是可行的。您可以使用现有的树行为,它们有很多有用的方法来管理您的层次结构。来自knplabs的DoctrineExtensionsDoctrineBehaviors