2014-10-10 103 views
0

我对Symfony真的很陌生,所以如果这听起来很愚蠢,我很抱歉,如果有人纠正我的理解,我会很感激。在Sumfony 2.5创建多个onetoMany关系

我正在阅读约Databases and Doctrine阅读时,我想为什么不创建一个虚拟的博客应用程序来练习。

伪博客应用我的工作很简单,只需三个表及其实体

  • (其中博客文章去)其Entity是实体/ post.php中,
  • 评论(其中要发表评论,去)的Entity是实体/ comments.php了
  • (其中职位类别去)其Entity是实体/ Category.php。

我能够得到的职位/类别/评论保存,显示,更新,删除所有工作正常。

我现在正在处理的是博客显示时,其类别显示为数字(类别ID),所以我试图链接邮政表与类别表显示类别名称而不是数字。

问题1,由于帖子也与评论表链接,我需要链接相同的帖子表与类别表,我们可以做到这一点在Entity/Post.php

class Post 
{ 
    /** 
    * @ORM\OneToMany(targetEntity="Comments", mappedBy="post") 
    */ 

    /** 
    * @ORM\ManyToOne(targetEntity="Category", inversedBy="post") 
    * @ORM\JoinColumn(name="category", referencedColumnName="id") 
    */ 
    protected $comment; 
    protected $categories; 

如果不是,那么处理这些关系的正确方法是什么?

问题2,在阅读“Fetching Related Objects",看来我应该能够得到分类名称我做以下

$posts = $this->getDoctrine()->getRepository('BlogBundle:Post')->findBy(array('category' => $id), array('id' => 'DESC')); 
$category_name = $posts->getCategory(); 

,但是这给了我一个错误

Error: Call to a member function getCategory() on a non-object in 

我可以确认这个getCategory()方法确实存在于Post实体中

我会非常感谢这里的任何帮助。

回答

2

问题1

注解都很好,但你必须给他们写对他们属于财产的顶部,否则会被忽略:

class Post 
{ 
    /** 
    * @ORM\OneToMany(targetEntity="Comment", mappedBy="post") 
    */ 
    protected $comments; 

    /** 
    * @ORM\ManyToOne(targetEntity="Category", inversedBy="posts") 
    * @ORM\JoinColumn(name="category", referencedColumnName="id") 
    */ 
    protected $category; 

    public function __constructor() 
    { 
     $this->comments = new ArrayCollection(); 
    } 

    // ... 
} 

制作舒尔你有正确的对方在其他实体集合:

class Category 
{ 
    /** 
    * @ORM\OneToMany(targetEntity="Post", mappedBy="category") 
    */ 
    protected $posts; 

    public function __constructor() 
    { 
     $this->posts = new ArrayCollection(); 
    } 

    // ... 
} 

class Comment 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="Post", inversedBy="comments") 
    * @ORM\JoinColumn(name="post", referencedColumnName="id") 
    */ 
    protected $post; 

    // ... 
} 

请注意,我改变了一些单数/复数的属性和Comments类名。应该更直观。

问题2

findBy返回找到的对象的阵列,即使只有一个对象被发现。使用findOneBy或通过您的结果的foreach。

+0

感谢您确认注释是否正确,并纠正我需要置身于财产之上,我仍然觉得某些东西与注释不符,因为我有一种感觉,它没有加入两张桌子,我看着我的mysql和我没有看到任何外键集,我在设置注释后运行'php app/console doctrine:schema:update --force' – Baig 2014-10-10 11:38:26

+0

@Baig我为'Category'和'Comment'添加了类,现在可能更清晰了? – SBH 2014-10-10 12:00:12

+0

谢谢,这解决了问题1的问题,但我仍然不清楚问题2的问题是什么 – Baig 2014-10-10 12:47:29