在树枝中显示自我引用实体



我正在尝试使用Doctrine的自我参考关联来呈现链接树。我有一个类似:

的实体
<?php
namespace AppEntity;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineORMMapping as ORM;
/**
 * @ORMTable(name="link")
 * @ORMEntity(repositoryClass="AppRepositoryLinkRepository")
 */
class Link
{
    /**
     * @ORMColumn(name="link_id", type="integer", nullable=false, options={"unsigned"=true})
         * @ORMId()
         * @ORMGeneratedValue(strategy="IDENTITY")
     */
    private $linkId;
    /**
     * @ORMColumn(name="name", type="string", length=50)
     */
    private $name;
    /**
     * @ORMColumn(name="url", type="string", length=500)
     */
    private $url;
    /**
     * @ORMColumn(name="parent_id", type="integer")
     */
    private $parentId;
    /**
     * @ORMOneToMany(targetEntity="Link", mappedBy="parent")
     */
    private $children;
    /**
     * @ORMManyToOne(targetEntity="Link", inversedBy="children")
     * @ORMJoinColumn(name="parent_id", referencedColumnName="link_id")
     */
    private $parent;
    public function __construct()
    {
        $this->children = new ArrayCollection();
    }
    public function getLinkId(): ?int
    {
        return $this->linkId;
    }
    // Getters and setters ...
    /**
     * @return ArrayCollection
     */
    public function getChildren()
    {
        return $this->children;
    }
}

,在我的控制器中,我将其获取链接并调用Twig模板,例如:

public function link(int $linkId, LinkRepository $linkRepository)
{
    $link = $linkRepository->findOneBy(['linkId' => $linkId]);
    return $this->render('link.html.twig',
    [
        'link' => $link
    ]);
}

和树枝模板是这样的:

{% extends 'base.html.twig' %}
{% block body %}
    {{ link.name }}
    <h2>Children:</h2>
    {% import _self as macros %}
    <ul>
        <li>{{ link.name }}
            {{ macros.link_tree(link) }}
        </li>
    </ul>
{% endblock %}
{% macro link_tree(link) %}
    {% import _self as macros %}
    <ul>
    {% for linkChild in link.children %}
        <li>
            {{ link.name }}
            {% if linkChild.children %}
                <ul>
                    {{ macros.link_tree(linkChild.children) }}
                </ul>
            {% endif %}
        </li>
    {% endfor %}
    </ul>
{% endmacro %}

尽管当我调用此控制器时,它给了我这个错误:

财产"儿童"也不是一种方法"儿童((", " getChildren(("/" iSchildren(("/" haschildren(("或" __call(("存在,并且 在"学说 orm persistentCollection"类中可以公开访问。

这似乎是我提到linkChild.Children的twig模板中的时代。

我如何在树枝中递归循环循环((?

首先,您的所有学说映射无效:您应该删除parentId字段,因此无需它,因为您已经添加了与parent字段的适当关联。

其次,您应该使用Symfony的ParamConverter来获取控制器内部的链接:

public function link(Link $link)

是的,它看起来很简单,您只需在控制器操作中输入链接变量即可获得链接,而无需在此处使用链接。您可以在此处找到有关ParamConverter的更多信息。

最后,这似乎是数据中的一个问题,因为当您期望链接类实例时,您会获得学说集合的实例。尝试调试,使用{{dump((}}在您的树枝模板中,此时还没有足够的数据来帮助您进一步解决此问题。但是您绝对应该先修复映射问题,然后再尝试。

,所以事实证明我向宏发送了错误的东西,它期望 linkChild,而我正在通过 linkChild.children。在宏内部试图引用linkChild.children.children

这是通过使用:

修复的
{{ link.name }}
{% if linkChild.children %}
  <ul>
    {{ macros.link_tree(linkChild) }}
  </ul>
{% endif %}

相关内容

  • 没有找到相关文章