递归实体主义

Ant*_*NEE 0 php symfony1 symfony doctrine-orm

我想在我的网站上制作一个导航栏.

我有一个SQL表菜单.菜单可以有儿童菜单等....

CREATE TABLE IF NOT EXISTS MENU
(
    menu_Id INT AUTO_INCREMENT NOT NULL,
    nom VARCHAR(100) NOT NULL,
    route VARCHAR(255) NOT NULL,
    parent INT NULL,
    CONSTRAINT pk_MENU PRIMARY KEY (menu_Id),
    CONSTRAINT fk_MENU_MENU FOREIGN KEY (parent) REFERENCES MENU(menu_Id)
);
Run Code Online (Sandbox Code Playgroud)

我在Entity文件夹中的symfony项目中有一个类.

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
* @ORM\Entity
* @ORM\Table(name="menu")
*/
class Menu
{
    /**
    * @ORM\Column(name="menu_Id", type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    protected $id;

    /**
    * @ORM\Column(name="nom", type="string", length=100)
    */
    protected $lib;

    /**
    * @ORM\Column(type="string", length=100)
    */
    protected $route;

    /**
    * @ORM\OneToMany(targetEntity="Menu", mappedBy="parent")
    */
    protected $listeSousMenus;

    //... GETTERS AND SETTERS ...
}
Run Code Online (Sandbox Code Playgroud)

当我显示页面时,我有这个错误:

在第23行的bandeau.html.twig中呈现模板("通知:未定义的索引:父")期间抛出了异常.

我该如何解决错误?如何使用递归子项实现我的菜单?

Rap*_*lié 6

错误是明确的:您的父字段在哪里?

您需要添加父属性:

/**
* @ORM\ManyToOne(targetEntity="Menu", inversedBy="listeSousMenus")
* @ORM\JoinColumn(name="parent", referencedColumnName="menu_Id")
*/
protected $parent;
Run Code Online (Sandbox Code Playgroud)

在文档中查看此示例:http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-self-referencing

<?php
/** @Entity */
class Category
{
    // ...
    /**
     * @OneToMany(targetEntity="Category", mappedBy="parent")
     */
    private $children;

    /**
     * @ManyToOne(targetEntity="Category", inversedBy="children")
     * @JoinColumn(name="parent_id", referencedColumnName="id")
     */
    private $parent;
    // ...

    public function __construct() {
        $this->children = new \Doctrine\Common\Collections\ArrayCollection();
    }
}
Run Code Online (Sandbox Code Playgroud)