0

我对 Symfony 真的很陌生,所以如果这听起来很愚蠢,我提前道歉,如果有人纠正我的理解,我将非常感激。

我正在阅读有关数据库和 Doctrine的内容,阅读时我想为什么不创建一个虚拟博客应用程序来练习。

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

  • post(博客帖子所在的位置)它Entity是Entity/Post.php,
  • 评论(发表评论的地方)它Entity是Entity/Comments.php
  • 类别(帖子类别所在的位置)它Entity是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,在阅读“获取相关对象”时,似乎我应该能够通过执行以下操作来获取类别名称

$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

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

4

1 回答 1

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。

于 2014-10-10T11:08:06.323 回答