2014-03-29 58 views
3

我面臨着與我的Doctrine實體關係有關的問題。 這裏的事:Symfony2從具有ManyToMany關係的倒立實體中獲取對象

我有2個實體:文章和類別 文章是高手,類是我希望得到的文章和其他方式,文章從類別分類從

我做了這樣的多對多關係:

class Article 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Alpha\BlogBundle\Entity\Category", cascade={"persist"}, inversedBy="Article") 
    * @ORM\JoinTable(name="article_category") 
    */ 
    private $categories; 

public function __construct(){ 
    $this->categories = new \Doctrine\Common\Collections\ArrayCollection(); 

和在類別實體:

class Category 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Alpha\BlogBundle\Entity\Article", cascade={"persist"}, mappedBy="Category") 
    */ 
    private $articles; 

public function __construct(){ 
    $this->articles = new \Doctrine\Common\Collections\ArrayCollection(); 

在我的文章的實體,我還添加了如下因素:

public function addCategory(\Alpha\BlogBundle\Entity\Category $categories) 
{ 
    $this->categories[] = $categories; 
    $categories->addArticle($this); 
    return $this; 
} 

(第四線,$categories->addArticle($this);

在我的控制器:

public function ajouterAction($data = null, $id = null) { 

    // On récupère l'EM pour enregistrer en BDD 
    $em = $this->getDoctrine()->getManager(); 

    // On définit une nouvel objet Article avec de nouveaux attributs 
    $article = new Article; 
    $article->setTitle('1er article !'); 
    $article->setContent('Cupcake ipsum dolor sit amet ice cream tiramisu unerdwear.com. Caramels halvah lollipop apple pie soufflé. Tart lollipop soufflé candy tootsie roll sweet donut. Lemon drops danish I love icing I love. Candy canes cheesecake I love. I love tiramisu applicake. I love gingerbread soufflé sweet roll muffin. Cupcake liquorice gummi bears muffin chocolate jelly-o.'); 
    $article->setAuthor('Toto'); 

    // On définit une nouvel objet Category avec de nouveaux attributs 
    $category = new Category; 
    $category->setName('Poney'); 

    $article->addCategory($category); 

    $em->persist($category); 
    $em->persist($article); 

    $em->flush(); 

    return $this->render('AlphaBlogBundle:Blog:ajouter.html.twig'); 
} 

而完成,讓我來自類別的文章:

public function categoryAction($cat = null) { 

    $em = $this->getDoctrine()->getManager(); 

    // Si cat est vide, on renvoit la liste complète des catégories 
    if (!isset($cat) || empty($cat) || $cat == null) { 

     $categories = $em->getRepository('AlphaBlogBundle:Category')->findAll(); 

     return $this->render('AlphaBlogBundle:Blog:categories.html.twig', array(
      'categories' => $categories 
     )); 
    } 
    // Sinon on renvoit la liste des articles de la catégorie 
    else { 
     $category = $em->getRepository('AlphaBlogBundle:Category')->findOneBy(array('name' => $cat)); 
     $articles = $category->getArticles(); 

     return $this->render('AlphaBlogBundle:Blog:category.html.twig', array(
      'articles' => $articles, 
      'category' => $category 
      //'name' => $name 
     )); 
    } 
} 

在我看來,我可以看到我的類別的名稱,但文章沒有顯示,我有這樣的錯誤消息:

ContextErrorException: Notice: Undefined index: Category in /home/franck/www/alpha/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php line 1036

我在這裏有點失落,如果有人可以幫助。

回答

5

由於從doctrine documentation如下:

的mappedBy:此選項指定的targetEntity 是這種關係的擁有方的屬性名稱。它是 關係的反面的必需屬性。

inversedBy:inversedBy屬性指定實體 中與該關係相反的一側的字段。

所以,儘量在Category類改變inversedBy="Article"在Article類inversedBy="articles"mappedBy="Category"mappedBy="categories"

另請參閱this多對多雙向示例。

希望這會有所幫助。

2

好了,我遵循你的建議,將文章和文章分類,並按類別分類。我也改變了我的映射主控方,文章,這樣的:

/** 
* @ORM\ManyToMany(
* targetEntity="Alpha\BlogBundle\Entity\Category", 
* cascade={"persist"}, 
* inversedBy="articles" 
*) 
* @ORM\JoinTable(name="article_category", 
*  joinColumns={@ORM\JoinColumn(name="article_id", referencedColumnName="id")}, 
*  inverseJoinColumns={ 
*   @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
*  } 
*) 
*/ 

它的工作原理就像一個魅力。我不完全明白,但我會研究:) :)

相關問題