Php 在Sumfony 2.5中创建多个一对一关系

Php 在Sumfony 2.5中创建多个一对一关系,php,symfony,doctrine-orm,symfony-2.5,Php,Symfony,Doctrine Orm,Symfony 2.5,我对Symfony很陌生,所以如果这听起来很愚蠢,我会提前道歉,如果有人能纠正我的理解,我会非常感激 我正在阅读,在阅读的过程中,我想为什么不创建一个虚拟博客应用程序来练习呢 我正在开发的虚拟博客应用程序非常简单,只有三个表及其实体 post(博客帖子的位置)它的实体是Entity/post.php 评论(发表评论的地方)它的实体是Entity/comments.php category(帖子分类的位置)它的实体是Entity/category.php 我能够获得帖子/类别/评论,以保存、显

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

我正在阅读,在阅读的过程中,我想为什么不创建一个虚拟博客应用程序来练习呢

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

  • post(博客帖子的位置)它的
    实体
    是Entity/post.php
  • 评论(发表评论的地方)它的
    实体
    是Entity/comments.php
  • category(帖子分类的位置)它的
    实体
    是Entity/category.php
我能够获得帖子/类别/评论,以保存、显示、更新、删除所有正常工作的内容

我现在正在做的是,当博客显示时,它的类别显示为一个数字(类别id),因此我尝试将post表与类别表链接,以显示类别名称而不是数字


问题1,因为帖子也与评论表链接,我需要将同一个帖子表与类别表链接,我们可以在
实体/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
实体中


我非常感谢您的帮助。

问题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;

    // ...
}
请注意,我更改了一些单数/复数属性和
注释
类名。这样应该更直观

问题2


findBy
返回一个找到的对象数组,即使只找到一个对象。使用
findOneBy
或foreach查看结果。

感谢您确认注释没有问题,并纠正我它们需要位于属性顶部的错误,我仍然觉得注释有问题,因为我感觉它不正确在连接两个表时,我正在查看mysql,没有看到任何外键集,在设置annotations@Baig我为
类别
评论
添加了类,现在可能更清晰了?谢谢,这解决了问题1的问题,但我仍然不清楚不清楚问题出在哪里2@Baig:现在,您查找所有类别为id
$id
(只是为了使舒尔:这不是您的帖子id,对吧)。结果是一个无、一个或多个
post
对象的数组。但它始终是一个数组。因此,您也可以选择
$posts[0]->getCategory()
或使用
findOneBy(…)
,则结果是类对象
Post
,而不是数组(或
null
,如果查询不匹配)。非常感谢,
$posts[0]->getCategory()
很好,我使用的knp paginator似乎与
findOneBy
不兼容。