在Symfony 2.5中创建多个一对多关系

时间:2014-10-10 09:59:33

标签: php symfony doctrine-orm symfony-2.5

我是Symfony的新手,所以如果这听起来很愚蠢我会道歉,如果有人纠正我的理解,我真的很感激。

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

我正在处理的虚拟博客应用程序非常简单,只有三个表及其实体

  • 发布(博文发布的地方)其Entity是Entity / Post.php,
  • 评论(在哪里发表评论go)其Entity是实体/评论.php
  • 类别(帖子类别的去处)其Entity是实体/类别.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方法

我真的很感激这里的任何帮助。

1 个答案:

答案 0 :(得分: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();
    }

    // ...
}

让shure在其他实体中设置正确的对应物:

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。