2017-08-08 10 views
1

助けを求めてください。私は自分のアプリケーションで1対多のエンティティを実行しようとしています。私は教義の文書を読んでいます。私はMenuItemクラスを持っています。これは、ページテーブルとの関係が1対1であり、テーブルメニューとの関係が多対多です。私はツリーメニューを取得する必要がありますので、MenuItemクラスは私のための子供のようにIDと親を持っていますが、更新スキーマが動作しないと、データベースの親フィールドはまだ外部キーではありません。ここに私のMenuItem.phpクラスのコードは次のとおりです。教義の多対多自己参照は行わないでください

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* MenuItem 
* 
* @ORM\Table(name="menu_item") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\MenuItemRepository") 
*/ 
class MenuItem 
{ 
    /** 
    * @var int 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @ORM\OneToMany(targetEntity="MenuItem", mappedBy="parentId") 
    */ 
    private $id; 

    /** 
    * @var string 
    * @ORM\Column(name="url", type="string", length=255, unique=true, nullable=true) 
    */ 
    private $url; 

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

    /** 
    * @var int 
    * @ORM\Column(name="parent", type="integer", nullable=true) 
    * @ORM\ManyToOne(targetEntity="MenuItem", inversedBy="id") 
    * @ORM\JoinColumn(name="parent", referencedColumnName="id") 
    */ 
    private $parentId; 

    /** 
    * Set url 
    * 
    * @param string $url 
    * 
    * @return MenuItem 
    */ 
    public function setUrl($url) 
    { 
     $this->url = $url; 

     return $this; 
    } 

    /** 
    * Get url 
    * 
    * @return string 
    */ 
    public function getUrl() 
    { 
     return $this->url; 
    } 

    /** 
    * Set name 
    * 
    * @param string $name 
    * 
    * @return MenuItem 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 

     return $this; 
    } 

    /** 
    * Get name 
    * 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 

    /** 
    * @ORM\ManyToMany(targetEntity="Menu", mappedBy="menuitems") 
    */ 
    private $menus; 
    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 
     $this->menus = new \Doctrine\Common\Collections\ArrayCollection(); 
     $this->id = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    /** 
    * Add menu 
    * 
    * @param \AppBundle\Entity\Menu $menu 
    * 
    * @return MenuItem 
    */ 
    public function addMenu(\AppBundle\Entity\Menu $menu) 
    { 
     $this->menus[] = $menu; 

     return $this; 
    } 

    /** 
    * Remove menu 
    * 
    * @param \AppBundle\Entity\Menu $menu 
    */ 
    public function removeMenu(\AppBundle\Entity\Menu $menu) 
    { 
     $this->menus->removeElement($menu); 
    } 

    /** 
    * Get menus 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getMenus() 
    { 
     return $this->menus; 
    } 

    /** 
    * @ORM\OneToOne(targetEntity="Page") 
    */ 
    private $page; 

    /** 
    * Set page 
    * 
    * @param \AppBundle\Entity\Page $page 
    * 
    * @return MenuItem 
    */ 
    public function setPage(\AppBundle\Entity\Page $page = null) 
    { 
     $this->page = $page; 

     return $this; 
    } 

    /** 
    * Get page 
    * 
    * @return \AppBundle\Entity\Page 
    */ 
    public function getPage() 
    { 
     return $this->page; 
    } 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set parent 
    * 
    * @param integer $parent 
    * 
    * @return MenuItem 
    */ 
    public function setParentId($parentId) 
    { 
     $this->parentId = $parentId; 

     return $this; 
    } 

    /** 
    * Get parent 
    * 
    * @return integer 
    */ 
    public function getParentId() 
    { 
     return $this->parentId; 
    } 
} 

答えて

2

はこれを使用しよう:

/** 
    * @var int 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    //other fields 

    /** 
    * One MenuItem has Many MenuItems. 
    * @ORM\OneToMany(targetEntity="MenuItem", mappedBy="parent") 
    */ 
    private $children; 

    /** 
    * Many MenuItems have One MenuItem. 
    * @ORM\ManyToOne(targetEntity="MenuItem", inversedBy="children") 
    * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", nullable=true) 
    */ 
    private $parent; 

私は$ idフィールド内の関係を削除して、あなたの事業体で見つかった場合はchildrenフィールドに

+0

私の投稿を編集していただきありがとうございます。それは3IDを持つ感覚を作るのですか?メインID、親ID、子ID – Anamesh

+1

私はこのソリューションを使用していて、あなたが存在する場合、親menuItemと子メニューitemを得ることができる、1つのidと2つの外部キーを持つことができます。 –

+0

今、このクラスによって教授マッピングエラーがあります。 - 関連付けAppBundle \ Entity \ MenuItem#childrenは、関連付けとして定義されていないフィールドとしてAppBundle \ Entity \ MenuItem#parentを所有するサイドフィールドを参照します。 - 関連付けAppBundle \ Entity \ MenuItem#childrenは、存在しない所有サイドフィールドAppBundle \ Entity \ MenuItem#parentを参照します。 – Anamesh

0

を追加しましたparentchildプロパティ - ドクトリンGEDMO拡張を試す時間。 Official bundle pageで詳細を見つけることができます。 doctrineツリーエクステンションを試してください。これはあなたのための完全なマッピングを提供します。非常に強力な機能!

+0

私は次のプロジェクトでそれを試します:) – Anamesh

関連する問題