【问题标题】:Retrieving Parents and Children - Self Referencing Entity检索父母和孩子 - 自引用实体
【发布时间】:2014-03-14 12:56:04
【问题描述】:

这里是菜鸟。我会说我可以看到曲线的顶峰,但我还有一段路要走。

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

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

关系是自引用的。

有 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() 函数的引用,但我的两个实体定义文件中都没有这个函数。

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

感谢您的帮助。

【问题讨论】:

    标签: symfony doctrine-orm self-reference


    【解决方案1】:

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

    /**
     * @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;
    

    【讨论】:

    • 谢谢,但这无济于事,当我转储实体数组时,所有父项和子项仍然为空。
    • 您是否尝试过仅使用一个实体来处理此过程?我不确定您是否需要两个实体才能达到您想要做的事情。 tblxchangecategories 实体文件可能有问题。我发布的代码是建立自我追溯关系的正确方式(这也是我在我的应用程序中所做的方式并且它正在工作)
    • 恐怕我迷路了。你必须更详细地解释事情。
    • 好的,没问题,但你也得帮我。您是否正在尝试建立一种自我参照的关系,对吗?目标是按照屏幕截图中的类别来表示类别?
    • 是的,你是对的。但是我仍然需要两张桌子,因为有些孩子有多个父母......并且输入最后一句话让我意识到我需要多对多(哎呀,我会改变关系)。回到我的想法,如果我们看到图片“其他一切”是多个父母的孩子。在某些父母身上,尽管付费字段是真实的,这就是连接表具有该字段的原因。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2022-09-23
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多